var JTUtil = {
    gId: function (id) {
        return document.getElementById(id) ? document.getElementById(id) : null
    }, gName: function (name) {
        return document.getElementsByTagName(name) ? document.getElementsByTagName(name) : null
    }, contains: function (a, b) {
        if (!a) return false;
        return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(arg) & 16)
    }, insertAfter: function (newElement, targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastChild == targetElement) {
            parent.appendChild(newElement)
        } else {
            parent.insertBefore(newElement, targetElement.nextSibling)
        }
    }, insertBefore: function (newElement, targetElement) {
        var parent = targetElement.parentNode;
        parent.insertBefore(newElement, targetElement)
    }, cDom: function (tagName) {
        return document.createElement(tagName)
    }, lScript: function (id, src, callback, cthis) {
        var script = JTUtil.cDom("script");
        script.name = id;
        script.type = "text/javascript";
        script.src = src;
        script.charset = "utf-8";
        script.onload = function () {
            if (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') {
                if (callback && cthis) {
                    callback.call(cthis)
                } else if (callback) {
                    callback()
                }
            }
        };
        this.gName("head")[0].appendChild(script)
    }, lCss: function (id, src, callback, cthis) {
        var link = JTUtil.cDom("link");
        link.name = id;
        link.type = "text/css";
        link.rel = "stylesheet";
        link.charset = "utf-8";
        link.href = src;
        link.onload = function () {
            if (callback && cthis) {
                callback.call(cthis)
            } else if (callback) {
                callback()
            }
        };
        this.gName("head")[0].appendChild(link)
    }, getBrowser: function () {
        var ua = navigator.userAgent.toLowerCase();
        var btypeInfo = (ua.match(/firefox|chrome|safari|opera/g) || "other")[0];
        if ((ua.match(/edge|msie|trident/g) || [])[0]) {
            btypeInfo = "msie"
        }
        var pc = "pc";
        var prefix = "";
        var plat = "";
        var isTocuh = ("ontouchstart" in window) || (ua.indexOf("touch") != -1) || (ua.indexOf("mobile") != -1);
        if (isTocuh) {
            if (ua.indexOf("ipad") !== -1) {
                pc = "pad"
            } else if (ua.indexOf("mobile") !== -1) {
                pc = "mobile"
            } else if (ua.indexOf("android") !== -1) {
                pc = "androidPad"
            }
        } else {
            pc = "pc"
        }
        switch (btypeInfo) {
            case"chrome":
            case"safari":
            case"mobile":
                prefix = "webkit";
                break;
            case"msie":
                prefix = "ms";
                break;
            case"firefox":
                prefix = "Moz";
                break;
            case"opera":
                prefix = "O";
                break;
            default:
                prefix = "webkit";
                break
        }
        plat = (ua.indexOf("android") > 0) ? "android" : navigator.platform.toLowerCase();
        return {
            version: (ua.match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
            plat: plat,
            type: btypeInfo,
            pc: pc,
            prefix: prefix,
            isMobile: (pc == "pc" || pc == "other") ? false : true
        }
    }, getLanguage: function () {
        var nl = navigator.language;
        var lg = (nl === "zh-CN" || nl === "zh-cn") ? "cn" : (nl === "ja") ? "jp" : "en";
        return lg
    }, getWindowOrientation: function () {
        if (window.orientation == 0 || window.orientation == 180) {
            return 'Vertical'
        } else if (window.orientation == 90 || window.orientation == -90) {
            return 'Horizontal'
        }
        return null
    }, getWindowSize: function () {
        var wo = this.getWindowOrientation();
        var json = {
            position: {
                left: window.screenX || window.screenLeft,
                top: window.screenY || window.screenTop,
                width: window.screen.width,
                height: window.screen.height
            },
            width: document.documentElement.clientWidth || window.innerWidth || document.body.clientWidth,
            height: document.documentElement.clientHeight || window.innerHeight || document.body.clientHeight,
            viewPort: {
                width: document.documentElement.clientWidth || window.innerWidth || document.body.clientWidth,
                height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
                horizontalScroll: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
                verticalScroll: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
            },
            Document: {
                width: document.documentElement.scrollWidth || document.body.scrollWidth,
                height: document.documentElement.scrollHeight || document.body.scrollHeight
            }
        };
        if (this.getBrowser().pc == "pad" && wo == "Horizontal" && this.getBrowser().type == "safari") {
            var ver = navigator.userAgent.toLowerCase().match(/version\/[\d.]+/gi) + "";
            var ver_num = ver.replace(/[^0-9.]/ig, "").split(".")[0] || 8;
            if (ver_num && (ver_num < 8)) {
                json.viewPort.height = json.viewPort.height - 20
            }
        }
        return json
    }, loadResource: function (uri, callBack) {
        var xmlHttp = this.createXMLHttp();
        var url = uri;
        xmlHttp.open("GET", url, true);
        xmlHttp.send();
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4) {
                var result = xmlHttp.responseText || xmlHttp.response;
                if (callBack && typeof callBack == "function") {
                    callBack(result)
                }
            }
        }
    }, createXMLHttp: function () {
        var XmlHttp;
        if (window.ActiveXObject) {
            var arr = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
            for (var i = 0; i < arr.length; i++) {
                try {
                    XmlHttp = new ActiveXObject(arr[i]);
                    return XmlHttp
                } catch (error) {
                }
            }
        } else {
            try {
                XmlHttp = new XMLHttpRequest;
                return XmlHttp
            } catch (otherError) {
            }
        }
    }, to16Hex: function (v) {
        var s = v.toString(16);
        return s.length == 2 ? s : "0" + s
    }, rndRGB: function () {
        var r = Math.floor(Math.random() * 256), g = Math.floor(Math.random() * 256),
            b = Math.floor(Math.random() * 256);
        return "#" + this.to16Hex(r) + this.to16Hex(g) + this.to16Hex(b)
    }, rgbToHex: function (r, g, b) {
        return "#" + this.to16Hex(r) + this.to16Hex(g) + this.to16Hex(b)
    }, hexToRgb: function (rgb_str) {
        if (rgb_str.length != 7) {
            return [0, 0, 0]
        }
        var r = rgb_str.substr(1, 2), g = rgb_str.substr(3, 2), b = rgb_str.substr(3, 2);
        return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)]
    }, argbToRgba: function (argb) {
        var colorArr = argb ? argb.split(",") : "";
        var opacity = (colorArr[0] / 255).toFixed(2);
        var bgColor = colorArr ? "rgba(" + colorArr[1] + "," + colorArr[2] + "," + colorArr[3] + "," + opacity + ")" : "";
        return bgColor
    }, xmlParseToJSON: function (nodes, flag) {
        var json = {};
        for (var i = 0; i < nodes.length; i++) {
            var node = nodes[i];
            var name = node.nodeName;
            var type = node.nodeType;
            var value = null;
            if (type == 3) {
                continue
            }
            if (node.childNodes.length == 0) {
                value = null
            } else if (node.childNodes.length == 1 && node.childNodes[0].nodeType == 3) {
                value = node.childNodes[0].nodeValue
            } else {
                value = this.xmlParseToJSON(node.childNodes, flag)
            }
            if (!json[name]) {
                json[name] = value
            } else {
                if (Object.prototype.toString.call(json[name]) === "[object Array]") {
                    json[name].push(value)
                } else {
                    var _value = json[name];
                    json[name] = [];
                    json[name].push(_value);
                    json[name].push(value)
                }
            }
        }
        return json
    }, getXMLDOM: function (source) {
        var doc;
        if (window.ActiveXObject) {
            doc = new ActiveXObject("Msxml2.DOMDocument");
            doc.async = false;
            doc.loadXML(source)
        } else {
            var parser = new DOMParser();
            doc = parser.parseFromString(source, "text/xml")
        }
        return doc.documentElement
    }, supportsStyle: function (prop) {
        var div = JTUtil.cDom('div'), vendors = 'Khtml Ms O Moz Webkit'.split(' '), len = vendors.length;
        if (prop in div.style) return true;
        prop = prop.replace(/^[a-z]/, function (val) {
            return val.toUpperCase()
        });
        while (len--) {
            if (vendors[len] + prop in div.style) {
                return true
            }
        }
        return false
    }, pluginCheck: function () {
        var pluginSupported = {};
        var pluginList = {
            flash: {activex: "ShockwaveFlash.ShockwaveFlash", plugin: /flash/gim},
            pdf: {activex: "PDF.PdfCtrl", plugin: /adobe\s?acrobat/gim},
            java: {activex: navigator.javaEnabled(), plugin: /java/gim}
        };
        var isSupported = function (p) {
            if (window.ActiveXObject) {
                try {
                    new ActiveXObject(pluginList[p].activex);
                    pluginSupported[p] = true
                } catch (e) {
                    pluginSupported[p] = false
                }
            } else {
                for (var i = 0; i < navigator.plugins.length; i++) {
                    var pluginsObj = navigator.plugins[i];
                    if (pluginsObj.name.match(pluginList[p].plugin)) {
                        pluginSupported[p] = true;
                        return false
                    } else {
                        pluginSupported[p] = false
                    }
                }
            }
        };
        for (var key in pluginList) {
            isSupported(key)
        }
        return pluginSupported
    }, support_WebGL: function () {
        if (!!window.WebGLRenderingContext) {
            var canvas = document.createElement("canvas"),
                names = ["webgl", "experimental-webgl", "moz-webgl", "webkit-3d"], gl = false;
            for (var i in names) {
                try {
                    gl = canvas.getContext(names[i]);
                    if (gl) {
                        return true
                    }
                } catch (e) {
                }
            }
            return false
        }
        return false
    }, getWebGLInfo: function () {
        "use strict"
    }, support_Css3D: function () {
        var e, t, i = false, s = JTUtil.cDom("div");
        for (e = 0; e < 5; e++) if (typeof s.style[["p", "msP", "MozP", "WebkitP", "OP"][e] + "erspective"] != "undefined") {
            i = true, e == 3 && window.matchMedia && (t = window.matchMedia("(-webkit-transform-3d)"), t && (i = t.matches == true));
            break
        }
        return i
    }, registerCss: function (cssText) {
        var style = JTUtil.cDom("style");
        var head = document.getElementsByTagName("head")[0];
        if (!head) {
            return
        }
        if (document.all) {
            style.setAttribute("type", "text/css");
            style.styleSheet.cssText = cssText
        } else {
            style.appendChild(document.createTextNode(cssText))
        }
        if (head.firstChild) {
            head.insertBefore(style, head.firstChild)
        } else {
            head.appendChild(style)
        }
        return style
    }, isSupportFullScreen: function () {
        var doc = document.documentElement;
        var ua = navigator.userAgent.toLowerCase();
        var isQQBrowser = /mqqbrowser\//i.test(ua);
        if (isQQBrowser) return false;
        return ('requestFullscreen' in doc) || ('webkitRequestFullScreen' in doc) || ('mozRequestFullScreen' in doc && document.mozFullScreenEnabled) || false
    }, isFullScreen: function () {
        var dom = document;
        return dom.msFullscreenElement || dom.mozFullScreenElement || dom.webkitFullscreenElement || dom.webkitIsFullScreen || false
    }, reqFullScreen: function (dom) {
        var fullscreenElement = document.msFullscreenElement || document.mozFullScreenElement || document.webkitFullScreenElement || document.webkitIsFullScreen;
        var dom = dom ? dom : document.documentElement;
        if (!fullscreenElement) {
            dom.requestFullScreen && dom.requestFullScreen();
            dom.webkitRequestFullScreen && dom.webkitRequestFullScreen();
            dom.msRequestFullscreen && dom.msRequestFullscreen();
            dom.mozRequestFullScreen && dom.mozRequestFullScreen();
            dom.oRequestFullScreen && dom.oRequestFullScreen();
            return true
        } else {
            document.exitFullscreen && document.exitFullscreen();
            document.cancelFullScreen && document.cancelFullScreen();
            document.webkitCancelFullScreen && document.webkitCancelFullScreen();
            document.msExitFullscreen && document.msExitFullscreen();
            document.mozCancelFullScreen && document.mozCancelFullScreen();
            document.oCancelFullScreen && document.oCancelFullScreen();
            return false
        }
    }, firstCharUpCase: function (str) {
        var operate2 = "";
        str = str || "";
        for (var j = 0, len = str.length; j < len; j++) {
            var ch2 = str.charAt(j);
            if (j == 0) {
                operate2 = ch2.toUpperCase()
            } else {
                operate2 += ch2.toLowerCase()
            }
        }
        return operate2
    }, setToArray: function (obj) {
        if (obj && Object.prototype.toString.call(obj) != "[object Array]") {
            var cmaps = obj;
            var arr = [];
            arr.push(cmaps);
            return arr
        } else {
            return obj
        }
    }, getBestFitSize: function (ImgWidth, ImgHeight, tarWidth, tarHeight) {
        var img_width = ImgWidth, img_height = ImgHeight, img_lv = img_width / img_height;
        var target_width = tarWidth, target_height = tarHeight;
        var width, height, left, top;
        if (img_lv > 1) {
            width = target_width;
            height = target_width / img_width * img_height;
            if (height > target_height) {
                width = target_height / height * width;
                height = target_height
            }
            left = (target_width - width) * 0.5;
            top = (target_height - height) * 0.5
        } else {
            height = target_height;
            width = target_height / img_height * img_width;
            if (width > target_width) {
                height = target_width / width * height;
                width = target_width
            }
            left = (target_width - width) * 0.5;
            top = (target_height - height) * 0.5
        }
        return {"width": width, "height": height, "left": left, "top": top}
    }, getCenterSize: function (sWidth, sHeight, tWidth, tHeight) {
        return {"width": sWidth, "height": sHeight, "top": (tHeight - sHeight) * 0.5, "left": (tWidth - sWidth) * 0.5}
    }, setViewPort: function (sWidth) {
        if (this.getBrowser().pc === "pc") return;
        var metaViewPort = document.getElementsByName("viewport")[0];
        if (!metaViewPort) {
            metaViewPort = JTUtil.cDom("meta");
            metaViewPort.name = "viewport";
            document.getElementsByTagName("head")[0].appendChild(metaViewPort)
        }
        var DEFAULT_WIDTH = sWidth, ua = navigator.userAgent.toLowerCase(), deviceWidth = window.screen.width;
        var mobile = (/iphone|ipod/gi).test(navigator.platform);
        var contentText = "width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui,target-densitydpi=device-dpi";
        if (!isNaN(DEFAULT_WIDTH)) {
            if (mobile) {
                if (ua.indexOf("version/6") > 0 || ua.indexOf("iphone os 6") > 0) {
                    contentText = "width=640, initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5,minimal-ui"
                } else {
                    contentText = "width=" + DEFAULT_WIDTH + "px, user-scalable=no, minimal-ui,initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5"
                }
            }
            if (ua.indexOf("android") !== -1) {
                contentText = "target-densitydpi=device-dpi, user-scalable=no";
                if (ua.indexOf("mobile") !== -1) {
                    contentText = "target-densitydpi=device-dpi, width=" + DEFAULT_WIDTH + "px, user-scalable=no";
                    var devicePixelRatio = window.devicePixelRatio || 1,
                        targetDensitydpi = DEFAULT_WIDTH / deviceWidth * devicePixelRatio * 160,
                        versoinAndroid = parseFloat(ua.slice(ua.indexOf("android") + 8));
                    if (versoinAndroid < 4) {
                        contentText = 'target-densitydpi=' + targetDensitydpi + ', width=device-width, user-scalable=no'
                    }
                    if (ua.indexOf("qq") !== -1 || ua.indexOf("micromessenger") !== -1) {
                        contentText = 'target-densitydpi=' + targetDensitydpi + ', width=device-width, user-scalable=no'
                    }
                    if (ua.indexOf("firefox") !== -1) {
                        contentText = "target-densitydpi=device-dpi, width=" + DEFAULT_WIDTH + "px, user-scalable=no"
                    }
                }
            }
        }
        metaViewPort.content = contentText;
        return contentText
    }, getQueryString: function (name) {
        name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
        var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), results = regex.exec(location.search);
        return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "))
    }, getFileExt: function (str) {
        var str = str;
        var num = str.indexOf("?");
        if (num > 0) {
            str = str.substring(0, num)
        }
        var d = /\.[^\.]+$/.exec(str);
        return (d ? d[0] : "")
    }, css3Animate: function (curDom, css, time, fn) {
        var el = curDom;
        var Browser = JTUtil.getBrowser();
        var callback = function () {
            fn && fn(arguments);
            EventUtil.removeEvent(el, "transitionEnd", callback);
            el.style[Browser.prefix + "Transition"] = ""
        };
        EventUtil.addEvent(el, "transitionEnd", callback);
        var eff = "";
        for (var k in css) {
            eff += k + ' ' + time + 's,'
        }
        getComputedStyle(el).width;
        el.style[Browser.prefix + "Transition"] = eff + "color 0s";
        for (var k in css) {
            el.style[k] = css[k]
        }
    }, formatToMin: function (num) {
        var min = Math.floor(num / 60);
        min = min < 10 ? "0" + min : min;
        var sec = Math.floor(num % 60);
        sec = sec < 10 ? "0" + sec : sec;
        return min + ":" + sec
    }, getRandomNum: function (Min, Max) {
        var Range = Max - Min;
        var Rand = Math.random();
        return (Min + Math.round(Rand * Range))
    }, toUnicodeByStr: function (str) {
        var codes = [];
        for (var i = 0; i < str.length; i++) {
            codes.push(str.charCodeAt(i))
        }
        return codes
    }, toStrByUniCode: function (arr) {
        var codes = [];
        for (var i = 0; i < arr.length; i++) {
            codes.push(String.fromCharCode(arr[i]))
        }
        return codes.join("")
    }, isIFrame: function () {
        try {
            return window.self !== window.top
        } catch (e) {
            return true
        }
    }, isPow2: function (n) {
        return (n & (n - 1)) == 0
    }, isIOS: function () {
        return /(iPad|iPhone|iPod)/g.test(navigator.userAgent)
    }, isMobile: function () {
        var check = false;
        (function (a) {
            if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true
        })(navigator.userAgent || navigator.vendor || window.opera);
        return check
    }, isEmptyObject: function (e) {
        var t;
        for (t in e) return !1;
        return !0
    }
};
var EventUtil = {
    getEventName: function (name) {
        var transitionEnd, fullscreenchange, Browser;
        Browser = JTUtil.getBrowser();
        switch (Browser.prefix) {
            case"webkit":
                transitionEnd = 'webkitTransitionEnd';
                fullscreenchange = 'webkitfullscreenchange';
                break;
            case"ms":
                transitionEnd = 'MSTransitionEnd';
                fullscreenchange = 'MSFullscreenChange';
                break;
            case"O":
                transitionEnd = 'otransitionend';
                fullscreenchange = 'ofullscreenchange';
                break;
            case"Moz":
                transitionEnd = 'transitionend';
                fullscreenchange = 'mozfullscreenchange';
                break;
            default:
                transitionEnd = 'transitionend';
                fullscreenchange = 'fullscreenchange'
        }
        var list = {
            "mousewheel": (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel",
            "fullScreenChange": fullscreenchange,
            "resize": "resize"
        };
        return list[name] || name
    }, addEvent: function (dom, type, fn, callobj) {
        var name = this.getEventName(type);
        var callFn = function (e) {
            var e1 = EventUtil.getEvent(e);
            fn.call(callobj, e1, e)
        };
        if (dom.addEventListener) {
            dom.addEventListener(name, callFn, false)
        } else if (dom.attachEvent) {
            dom.attachEvent("on" + name, callFn)
        } else {
            dom["on" + name] = callFn
        }
        return callFn
    }, removeEvent: function (dom, type, fn) {
        var name = this.getEventName(type);
        if (dom.removeEventListener) {
            dom.removeEventListener(name, fn, false)
        } else if (dom.detachEvent) {
            dom.detachEvent("on" + name, fn)
        } else {
            dom["on" + name] = null
        }
        return dom
    }, getTarget: function (event) {
        return event.target || event.srcElement
    }, getEvent: function (event) {
        var Browser = JTUtil.getBrowser();
        if (Browser.isMobile) {
            EventUtil.stopDefault(event);
            EventUtil.stopPropagation(event)
        }
        return event.changedTouches ? event.changedTouches[0] : (event || window.event)
    }, stopDefault: function (event) {
        if (event.preventDefault) {
            event.preventDefault()
        } else {
            event.returnValue = false
        }
    }, stopPropagation: function (event) {
        if (event.stopPropagation) {
            event.stopPropagation()
        } else {
            event.cancelBubble = true
        }
    }, getButton: function (event) {
        if (document.implementation.hasFeature("MouseEvents", "2.0")) {
            return event.button
        } else {
            switch (event.button) {
                case 0:
                    return 0;
                case 2:
                case 6:
                    return 2;
                case 4:
                    return 1
            }
        }
    }, getEventSize: function (event) {
        return {x: event.clientX, y: event.clientY}
    }, getOffsetX: function (event) {
        var evt = event || window.event;
        var srcObj = evt.target || evt.srcElement;
        if (evt.offsetX) {
            return evt.offsetX
        } else {
            var rect = srcObj.getBoundingClientRect();
            var clientx = evt.clientX;
            return clientx - rect.left
        }
    }, getOffsetY: function (event) {
        var evt = event || window.event;
        var srcObj = evt.target || evt.srcElement;
        if (evt.offsetY) {
            return evt.offsetY
        } else {
            var rect = srcObj.getBoundingClientRect();
            var clienty = evt.clientY;
            return clienty - rect.top
        }
    }, throttle: function (fn, delay, immediate, debounce) {
        var curr = +new Date(), last_call = 0, last_exec = 0, timer = null, diff, context, args, exec = function () {
            last_exec = curr;
            fn.apply(context, args)
        };
        return function () {
            curr = +new Date();
            context = this, args = arguments, diff = curr - (debounce ? last_call : last_exec) - delay;
            clearTimeout(timer);
            if (debounce) {
                if (immediate) {
                    timer = setTimeout(exec, delay)
                } else if (diff >= 0) {
                    exec()
                }
            } else {
                if (diff >= 0) {
                    exec()
                } else if (immediate) {
                    timer = setTimeout(exec, -diff)
                }
            }
            last_call = curr
        }
    }, debounce: function (fn, delay, immediate) {
        return this.throttle(fn, delay, immediate, true)
    }
};
var DomUtil = {
    inject: function (curDom, targetDom) {
        targetDom && targetDom.appendChild(curDom);
        return curDom
    }, insertAfter: function (curElement, targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastChild == targetElement) {
            parent.appendChild(curElement)
        } else {
            parent.insertBefore(curElement, targetElement.nextSibling)
        }
    }, insertBefore: function (curElement, targetElement) {
        var parent = targetElement.parentNode;
        parent.insertBefore(curElement, targetElement)
    }, setStyles: function (curDom, options) {
        for (var key in options) {
            curDom.style[key] = options[key]
        }
        return curDom
    }, getStyle: function (element, attr) {
        if (typeof window.getComputedStyle != 'undefined') {
            return parseInt(window.getComputedStyle(element, null)[attr])
        } else if (element.currentStyle) {
            return parseInt(element.currentStyle[attr])
        }
    }, setProperties: function (curDom, options) {
        for (var key in options) {
            curDom.setAttribute(key, options[key])
        }
        return curDom
    }, destroy: function (curDom) {
        curDom.parentNode && curDom.parentNode.removeChild(curDom)
    }, hasClass: function (ele, cls) {
        return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
    }, addClass: function (ele, cls) {
        if (!this.hasClass(ele, cls)) {
            ele.className += " " + cls
        }
    }, removeClass: function (ele, cls) {
        if (this.hasClass(ele, cls)) {
            var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
            ele.className = ele.className.replace(reg, " ")
        }
    }, getSize: function (dom) {
        var ro = dom.getBoundingClientRect();
        var Top = ro.top;
        var Bottom = ro.bottom;
        var Left = ro.left;
        var Right = ro.right;
        var Width = ro.width || Right - Left;
        var Height = ro.height || Bottom - Top;
        return {top: Top, left: Left, right: Right, bottom: Bottom, width: Width, height: Height}
    }
};
(function (_global) {
    "use strict";
    var shim = {};
    if (typeof exports === "undefined") {
        shim.exports = typeof window !== "undefined" ? window : _global
    } else {
        shim.exports = exports
    }
    (function (exports) {
        if (!GLMAT_EPSILON) {
            var GLMAT_EPSILON = 1e-6
        }
        if (!GLMAT_ARRAY_TYPE) {
            var GLMAT_ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array
        }
        if (!GLMAT_RANDOM) {
            var GLMAT_RANDOM = Math.random
        }
        var glMatrix = {};
        glMatrix.setMatrixArrayType = function (type) {
            GLMAT_ARRAY_TYPE = type
        };
        if (typeof exports !== "undefined") {
            exports.glMatrix = glMatrix
        }
        var degree = Math.PI / 180;
        glMatrix.toRadian = function (a) {
            return a * degree
        };
        var vec2 = {};
        vec2.create = function () {
            var out = new GLMAT_ARRAY_TYPE(2);
            out[0] = 0;
            out[1] = 0;
            return out
        };
        vec2.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(2);
            out[0] = a[0];
            out[1] = a[1];
            return out
        };
        vec2.fromValues = function (x, y) {
            var out = new GLMAT_ARRAY_TYPE(2);
            out[0] = x;
            out[1] = y;
            return out
        };
        vec2.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            return out
        };
        vec2.set = function (out, x, y) {
            out[0] = x;
            out[1] = y;
            return out
        };
        vec2.add = function (out, a, b) {
            out[0] = a[0] + b[0];
            out[1] = a[1] + b[1];
            return out
        };
        vec2.subtract = function (out, a, b) {
            out[0] = a[0] - b[0];
            out[1] = a[1] - b[1];
            return out
        };
        vec2.sub = vec2.subtract;
        vec2.multiply = function (out, a, b) {
            out[0] = a[0] * b[0];
            out[1] = a[1] * b[1];
            return out
        };
        vec2.mul = vec2.multiply;
        vec2.divide = function (out, a, b) {
            out[0] = a[0] / b[0];
            out[1] = a[1] / b[1];
            return out
        };
        vec2.div = vec2.divide;
        vec2.min = function (out, a, b) {
            out[0] = Math.min(a[0], b[0]);
            out[1] = Math.min(a[1], b[1]);
            return out
        };
        vec2.max = function (out, a, b) {
            out[0] = Math.max(a[0], b[0]);
            out[1] = Math.max(a[1], b[1]);
            return out
        };
        vec2.scale = function (out, a, b) {
            out[0] = a[0] * b;
            out[1] = a[1] * b;
            return out
        };
        vec2.scaleAndAdd = function (out, a, b, scale) {
            out[0] = a[0] + b[0] * scale;
            out[1] = a[1] + b[1] * scale;
            return out
        };
        vec2.distance = function (a, b) {
            var x = b[0] - a[0], y = b[1] - a[1];
            return Math.sqrt(x * x + y * y)
        };
        vec2.dist = vec2.distance;
        vec2.squaredDistance = function (a, b) {
            var x = b[0] - a[0], y = b[1] - a[1];
            return x * x + y * y
        };
        vec2.sqrDist = vec2.squaredDistance;
        vec2.length = function (a) {
            var x = a[0], y = a[1];
            return Math.sqrt(x * x + y * y)
        };
        vec2.len = vec2.length;
        vec2.squaredLength = function (a) {
            var x = a[0], y = a[1];
            return x * x + y * y
        };
        vec2.sqrLen = vec2.squaredLength;
        vec2.negate = function (out, a) {
            out[0] = -a[0];
            out[1] = -a[1];
            return out
        };
        vec2.inverse = function (out, a) {
            out[0] = 1 / a[0];
            out[1] = 1 / a[1];
            return out
        };
        vec2.normalize = function (out, a) {
            var x = a[0], y = a[1];
            var len = x * x + y * y;
            if (len > 0) {
                len = 1 / Math.sqrt(len);
                out[0] = a[0] * len;
                out[1] = a[1] * len
            }
            return out
        };
        vec2.dot = function (a, b) {
            return a[0] * b[0] + a[1] * b[1]
        };
        vec2.cross = function (out, a, b) {
            var z = a[0] * b[1] - a[1] * b[0];
            out[0] = out[1] = 0;
            out[2] = z;
            return out
        };
        vec2.lerp = function (out, a, b, t) {
            var ax = a[0], ay = a[1];
            out[0] = ax + t * (b[0] - ax);
            out[1] = ay + t * (b[1] - ay);
            return out
        };
        vec2.random = function (out, scale) {
            scale = scale || 1;
            var r = GLMAT_RANDOM() * 2 * Math.PI;
            out[0] = Math.cos(r) * scale;
            out[1] = Math.sin(r) * scale;
            return out
        };
        vec2.transformMat2 = function (out, a, m) {
            var x = a[0], y = a[1];
            out[0] = m[0] * x + m[2] * y;
            out[1] = m[1] * x + m[3] * y;
            return out
        };
        vec2.transformMat2d = function (out, a, m) {
            var x = a[0], y = a[1];
            out[0] = m[0] * x + m[2] * y + m[4];
            out[1] = m[1] * x + m[3] * y + m[5];
            return out
        };
        vec2.transformMat3 = function (out, a, m) {
            var x = a[0], y = a[1];
            out[0] = m[0] * x + m[3] * y + m[6];
            out[1] = m[1] * x + m[4] * y + m[7];
            return out
        };
        vec2.transformMat4 = function (out, a, m) {
            var x = a[0], y = a[1];
            out[0] = m[0] * x + m[4] * y + m[12];
            out[1] = m[1] * x + m[5] * y + m[13];
            return out
        };
        vec2.forEach = function () {
            var vec = vec2.create();
            return function (a, stride, offset, count, fn, arg) {
                var i, l;
                if (!stride) {
                    stride = 2
                }
                if (!offset) {
                    offset = 0
                }
                if (count) {
                    l = Math.min(count * stride + offset, a.length)
                } else {
                    l = a.length
                }
                for (i = offset; i < l; i += stride) {
                    vec[0] = a[i];
                    vec[1] = a[i + 1];
                    fn(vec, vec, arg);
                    a[i] = vec[0];
                    a[i + 1] = vec[1]
                }
                return a
            }
        }();
        vec2.str = function (a) {
            return "vec2(" + a[0] + ", " + a[1] + ")"
        };
        if (typeof exports !== "undefined") {
            exports.vec2 = vec2
        }
        var vec3 = {};
        vec3.create = function () {
            var out = new GLMAT_ARRAY_TYPE(3);
            out[0] = 0;
            out[1] = 0;
            out[2] = 0;
            return out
        };
        vec3.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(3);
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            return out
        };
        vec3.fromValues = function (x, y, z) {
            var out = new GLMAT_ARRAY_TYPE(3);
            out[0] = x;
            out[1] = y;
            out[2] = z;
            return out
        };
        vec3.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            return out
        };
        vec3.set = function (out, x, y, z) {
            out[0] = x;
            out[1] = y;
            out[2] = z;
            return out
        };
        vec3.add = function (out, a, b) {
            out[0] = a[0] + b[0];
            out[1] = a[1] + b[1];
            out[2] = a[2] + b[2];
            return out
        };
        vec3.subtract = function (out, a, b) {
            out[0] = a[0] - b[0];
            out[1] = a[1] - b[1];
            out[2] = a[2] - b[2];
            return out
        };
        vec3.sub = vec3.subtract;
        vec3.multiply = function (out, a, b) {
            out[0] = a[0] * b[0];
            out[1] = a[1] * b[1];
            out[2] = a[2] * b[2];
            return out
        };
        vec3.mul = vec3.multiply;
        vec3.divide = function (out, a, b) {
            out[0] = a[0] / b[0];
            out[1] = a[1] / b[1];
            out[2] = a[2] / b[2];
            return out;
        };
        vec3.div = vec3.divide;
        vec3.min = function (out, a, b) {
            out[0] = Math.min(a[0], b[0]);
            out[1] = Math.min(a[1], b[1]);
            out[2] = Math.min(a[2], b[2]);
            return out;
        };
        vec3.max = function (out, a, b) {
            out[0] = Math.max(a[0], b[0]);
            out[1] = Math.max(a[1], b[1]);
            out[2] = Math.max(a[2], b[2]);
            return out;
        };
        vec3.scale = function (out, a, b) {
            out[0] = a[0] * b;
            out[1] = a[1] * b;
            out[2] = a[2] * b;
            return out;
        };
        vec3.scaleAndAdd = function (out, a, b, scale) {
            out[0] = a[0] + b[0] * scale;
            out[1] = a[1] + b[1] * scale;
            out[2] = a[2] + b[2] * scale;
            return out;
        };
        vec3.distance = function (a, b) {
            var x = b[0] - a[0], y = b[1] - a[1], z = b[2] - a[2];
            return Math.sqrt(x * x + y * y + z * z);
        };
        vec3.dist = vec3.distance;
        vec3.squaredDistance = function (a, b) {
            var x = b[0] - a[0], y = b[1] - a[1], z = b[2] - a[2];
            return x * x + y * y + z * z;
        };
        vec3.sqrDist = vec3.squaredDistance;
        vec3.length = function (a) {
            var x = a[0], y = a[1], z = a[2];
            return Math.sqrt(x * x + y * y + z * z);
        };
        vec3.len = vec3.length;
        vec3.squaredLength = function (a) {
            var x = a[0], y = a[1], z = a[2];
            return x * x + y * y + z * z;
        };
        vec3.sqrLen = vec3.squaredLength;
        vec3.negate = function (out, a) {
            out[0] = -a[0];
            out[1] = -a[1];
            out[2] = -a[2];
            return out;
        };
        vec3.inverse = function (out, a) {
            out[0] = 1 / a[0];
            out[1] = 1 / a[1];
            out[2] = 1 / a[2];
            return out
        };
        vec3.normalize = function (out, a) {
            var x = a[0], y = a[1], z = a[2];
            var len = x * x + y * y + z * z;
            if (len > 0) {
                len = 1 / Math.sqrt(len);
                out[0] = a[0] * len;
                out[1] = a[1] * len;
                out[2] = a[2] * len
            }
            return out
        };
        vec3.dot = function (a, b) {
            return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
        };
        vec3.cross = function (out, a, b) {
            var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2];
            out[0] = ay * bz - az * by;
            out[1] = az * bx - ax * bz;
            out[2] = ax * by - ay * bx;
            return out
        };
        vec3.lerp = function (out, a, b, t) {
            var ax = a[0], ay = a[1], az = a[2];
            out[0] = ax + t * (b[0] - ax);
            out[1] = ay + t * (b[1] - ay);
            out[2] = az + t * (b[2] - az);
            return out
        };
        vec3.random = function (out, scale) {
            scale = scale || 1;
            var r = GLMAT_RANDOM() * 2 * Math.PI;
            var z = GLMAT_RANDOM() * 2 - 1;
            var zScale = Math.sqrt(1 - z * z) * scale;
            out[0] = Math.cos(r) * zScale;
            out[1] = Math.sin(r) * zScale;
            out[2] = z * scale;
            return out
        };
        vec3.transformMat4 = function (out, a, m) {
            var x = a[0], y = a[1], z = a[2], w = m[3] * x + m[7] * y + m[11] * z + m[15];
            w = w || 1;
            out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
            out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
            out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
            return out
        };
        vec3.transformMat3 = function (out, a, m) {
            var x = a[0], y = a[1], z = a[2];
            out[0] = x * m[0] + y * m[3] + z * m[6];
            out[1] = x * m[1] + y * m[4] + z * m[7];
            out[2] = x * m[2] + y * m[5] + z * m[8];
            return out
        };
        vec3.transformQuat = function (out, a, q) {
            var x = a[0], y = a[1], z = a[2], qx = q[0], qy = q[1], qz = q[2], qw = q[3], ix = qw * x + qy * z - qz * y,
                iy = qw * y + qz * x - qx * z, iz = qw * z + qx * y - qy * x, iw = -qx * x - qy * y - qz * z;
            out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
            out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
            out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
            return out
        };
        vec3.rotateX = function (out, a, b, c) {
            var p = [], r = [];
            p[0] = a[0] - b[0];
            p[1] = a[1] - b[1];
            p[2] = a[2] - b[2];
            r[0] = p[0];
            r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c);
            r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c);
            out[0] = r[0] + b[0];
            out[1] = r[1] + b[1];
            out[2] = r[2] + b[2];
            return out
        };
        vec3.rotateY = function (out, a, b, c) {
            var p = [], r = [];
            p[0] = a[0] - b[0];
            p[1] = a[1] - b[1];
            p[2] = a[2] - b[2];
            r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c);
            r[1] = p[1];
            r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c);
            out[0] = r[0] + b[0];
            out[1] = r[1] + b[1];
            out[2] = r[2] + b[2];
            return out
        };
        vec3.rotateZ = function (out, a, b, c) {
            var p = [], r = [];
            p[0] = a[0] - b[0];
            p[1] = a[1] - b[1];
            p[2] = a[2] - b[2];
            r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c);
            r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c);
            r[2] = p[2];
            out[0] = r[0] + b[0];
            out[1] = r[1] + b[1];
            out[2] = r[2] + b[2];
            return out
        };
        vec3.forEach = function () {
            var vec = vec3.create();
            return function (a, stride, offset, count, fn, arg) {
                var i, l;
                if (!stride) {
                    stride = 3
                }
                if (!offset) {
                    offset = 0
                }
                if (count) {
                    l = Math.min(count * stride + offset, a.length)
                } else {
                    l = a.length
                }
                for (i = offset; i < l; i += stride) {
                    vec[0] = a[i];
                    vec[1] = a[i + 1];
                    vec[2] = a[i + 2];
                    fn(vec, vec, arg);
                    a[i] = vec[0];
                    a[i + 1] = vec[1];
                    a[i + 2] = vec[2]
                }
                return a
            }
        }();
        vec3.angle = function (a, b) {
            var tempA = vec3.fromValues(a[0], a[1], a[2]);
            var tempB = vec3.fromValues(b[0], b[1], b[2]);
            vec3.normalize(tempA, tempA);
            vec3.normalize(tempB, tempB);
            var cosine = vec3.dot(tempA, tempB);
            if (cosine > 1) {
                return 0
            } else {
                return Math.acos(cosine)
            }
        };
        vec3.str = function (a) {
            return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"
        };
        if (typeof exports !== "undefined") {
            exports.vec3 = vec3
        }
        var vec4 = {};
        vec4.create = function () {
            var out = new GLMAT_ARRAY_TYPE(4);
            out[0] = 0;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            return out
        };
        vec4.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(4);
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            return out
        };
        vec4.fromValues = function (x, y, z, w) {
            var out = new GLMAT_ARRAY_TYPE(4);
            out[0] = x;
            out[1] = y;
            out[2] = z;
            out[3] = w;
            return out
        };
        vec4.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            return out
        };
        vec4.set = function (out, x, y, z, w) {
            out[0] = x;
            out[1] = y;
            out[2] = z;
            out[3] = w;
            return out
        };
        vec4.add = function (out, a, b) {
            out[0] = a[0] + b[0];
            out[1] = a[1] + b[1];
            out[2] = a[2] + b[2];
            out[3] = a[3] + b[3];
            return out
        };
        vec4.subtract = function (out, a, b) {
            out[0] = a[0] - b[0];
            out[1] = a[1] - b[1];
            out[2] = a[2] - b[2];
            out[3] = a[3] - b[3];
            return out
        };
        vec4.sub = vec4.subtract;
        vec4.multiply = function (out, a, b) {
            out[0] = a[0] * b[0];
            out[1] = a[1] * b[1];
            out[2] = a[2] * b[2];
            out[3] = a[3] * b[3];
            return out
        };
        vec4.mul = vec4.multiply;
        vec4.divide = function (out, a, b) {
            out[0] = a[0] / b[0];
            out[1] = a[1] / b[1];
            out[2] = a[2] / b[2];
            out[3] = a[3] / b[3];
            return out
        };
        vec4.div = vec4.divide;
        vec4.min = function (out, a, b) {
            out[0] = Math.min(a[0], b[0]);
            out[1] = Math.min(a[1], b[1]);
            out[2] = Math.min(a[2], b[2]);
            out[3] = Math.min(a[3], b[3]);
            return out
        };
        vec4.max = function (out, a, b) {
            out[0] = Math.max(a[0], b[0]);
            out[1] = Math.max(a[1], b[1]);
            out[2] = Math.max(a[2], b[2]);
            out[3] = Math.max(a[3], b[3]);
            return out
        };
        vec4.scale = function (out, a, b) {
            out[0] = a[0] * b;
            out[1] = a[1] * b;
            out[2] = a[2] * b;
            out[3] = a[3] * b;
            return out
        };
        vec4.scaleAndAdd = function (out, a, b, scale) {
            out[0] = a[0] + b[0] * scale;
            out[1] = a[1] + b[1] * scale;
            out[2] = a[2] + b[2] * scale;
            out[3] = a[3] + b[3] * scale;
            return out
        };
        vec4.distance = function (a, b) {
            var x = b[0] - a[0], y = b[1] - a[1], z = b[2] - a[2], w = b[3] - a[3];
            return Math.sqrt(x * x + y * y + z * z + w * w)
        };
        vec4.dist = vec4.distance;
        vec4.squaredDistance = function (a, b) {
            var x = b[0] - a[0], y = b[1] - a[1], z = b[2] - a[2], w = b[3] - a[3];
            return x * x + y * y + z * z + w * w
        };
        vec4.sqrDist = vec4.squaredDistance;
        vec4.length = function (a) {
            var x = a[0], y = a[1], z = a[2], w = a[3];
            return Math.sqrt(x * x + y * y + z * z + w * w)
        };
        vec4.len = vec4.length;
        vec4.squaredLength = function (a) {
            var x = a[0], y = a[1], z = a[2], w = a[3];
            return x * x + y * y + z * z + w * w
        };
        vec4.sqrLen = vec4.squaredLength;
        vec4.negate = function (out, a) {
            out[0] = -a[0];
            out[1] = -a[1];
            out[2] = -a[2];
            out[3] = -a[3];
            return out
        };
        vec4.inverse = function (out, a) {
            out[0] = 1 / a[0];
            out[1] = 1 / a[1];
            out[2] = 1 / a[2];
            out[3] = 1 / a[3];
            return out
        };
        vec4.normalize = function (out, a) {
            var x = a[0], y = a[1], z = a[2], w = a[3];
            var len = x * x + y * y + z * z + w * w;
            if (len > 0) {
                len = 1 / Math.sqrt(len);
                out[0] = a[0] * len;
                out[1] = a[1] * len;
                out[2] = a[2] * len;
                out[3] = a[3] * len
            }
            return out
        };
        vec4.dot = function (a, b) {
            return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]
        };
        vec4.lerp = function (out, a, b, t) {
            var ax = a[0], ay = a[1], az = a[2], aw = a[3];
            out[0] = ax + t * (b[0] - ax);
            out[1] = ay + t * (b[1] - ay);
            out[2] = az + t * (b[2] - az);
            out[3] = aw + t * (b[3] - aw);
            return out
        };
        vec4.random = function (out, scale) {
            scale = scale || 1;
            out[0] = GLMAT_RANDOM();
            out[1] = GLMAT_RANDOM();
            out[2] = GLMAT_RANDOM();
            out[3] = GLMAT_RANDOM();
            vec4.normalize(out, out);
            vec4.scale(out, out, scale);
            return out
        };
        vec4.transformMat4 = function (out, a, m) {
            var x = a[0], y = a[1], z = a[2], w = a[3];
            out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
            out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
            out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
            out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
            return out
        };
        vec4.transformQuat = function (out, a, q) {
            var x = a[0], y = a[1], z = a[2], qx = q[0], qy = q[1], qz = q[2], qw = q[3], ix = qw * x + qy * z - qz * y,
                iy = qw * y + qz * x - qx * z, iz = qw * z + qx * y - qy * x, iw = -qx * x - qy * y - qz * z;
            out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
            out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
            out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
            return out
        };
        vec4.forEach = function () {
            var vec = vec4.create();
            return function (a, stride, offset, count, fn, arg) {
                var i, l;
                if (!stride) {
                    stride = 4
                }
                if (!offset) {
                    offset = 0
                }
                if (count) {
                    l = Math.min(count * stride + offset, a.length)
                } else {
                    l = a.length
                }
                for (i = offset; i < l; i += stride) {
                    vec[0] = a[i];
                    vec[1] = a[i + 1];
                    vec[2] = a[i + 2];
                    vec[3] = a[i + 3];
                    fn(vec, vec, arg);
                    a[i] = vec[0];
                    a[i + 1] = vec[1];
                    a[i + 2] = vec[2];
                    a[i + 3] = vec[3]
                }
                return a
            }
        }();
        vec4.str = function (a) {
            return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
        };
        if (typeof exports !== "undefined") {
            exports.vec4 = vec4
        }
        var mat2 = {};
        mat2.create = function () {
            var out = new GLMAT_ARRAY_TYPE(4);
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 1;
            return out
        };
        mat2.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(4);
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            return out
        };
        mat2.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            return out
        };
        mat2.identity = function (out) {
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 1;
            return out
        };
        mat2.transpose = function (out, a) {
            if (out === a) {
                var a1 = a[1];
                out[1] = a[2];
                out[2] = a1
            } else {
                out[0] = a[0];
                out[1] = a[2];
                out[2] = a[1];
                out[3] = a[3]
            }
            return out
        };
        mat2.invert = function (out, a) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], det = a0 * a3 - a2 * a1;
            if (!det) {
                return null
            }
            det = 1 / det;
            out[0] = a3 * det;
            out[1] = -a1 * det;
            out[2] = -a2 * det;
            out[3] = a0 * det;
            return out
        };
        mat2.adjoint = function (out, a) {
            var a0 = a[0];
            out[0] = a[3];
            out[1] = -a[1];
            out[2] = -a[2];
            out[3] = a0;
            return out
        };
        mat2.determinant = function (a) {
            return a[0] * a[3] - a[2] * a[1]
        };
        mat2.multiply = function (out, a, b) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];
            var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];
            out[0] = a0 * b0 + a2 * b1;
            out[1] = a1 * b0 + a3 * b1;
            out[2] = a0 * b2 + a2 * b3;
            out[3] = a1 * b2 + a3 * b3;
            return out
        };
        mat2.mul = mat2.multiply;
        mat2.rotate = function (out, a, rad) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], s = Math.sin(rad), c = Math.cos(rad);
            out[0] = a0 * c + a2 * s;
            out[1] = a1 * c + a3 * s;
            out[2] = a0 * -s + a2 * c;
            out[3] = a1 * -s + a3 * c;
            return out
        };
        mat2.scale = function (out, a, v) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], v0 = v[0], v1 = v[1];
            out[0] = a0 * v0;
            out[1] = a1 * v0;
            out[2] = a2 * v1;
            out[3] = a3 * v1;
            return out
        };
        mat2.str = function (a) {
            return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
        };
        mat2.frob = function (a) {
            return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2))
        };
        mat2.LDU = function (L, D, U, a) {
            L[2] = a[2] / a[0];
            U[0] = a[0];
            U[1] = a[1];
            U[3] = a[3] - L[2] * U[1];
            return [L, D, U]
        };
        if (typeof exports !== "undefined") {
            exports.mat2 = mat2
        }
        var mat2d = {};
        mat2d.create = function () {
            var out = new GLMAT_ARRAY_TYPE(6);
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 1;
            out[4] = 0;
            out[5] = 0;
            return out
        };
        mat2d.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(6);
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            out[4] = a[4];
            out[5] = a[5];
            return out
        };
        mat2d.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            out[4] = a[4];
            out[5] = a[5];
            return out
        };
        mat2d.identity = function (out) {
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 1;
            out[4] = 0;
            out[5] = 0;
            return out
        };
        mat2d.invert = function (out, a) {
            var aa = a[0], ab = a[1], ac = a[2], ad = a[3], atx = a[4], aty = a[5];
            var det = aa * ad - ab * ac;
            if (!det) {
                return null
            }
            det = 1 / det;
            out[0] = ad * det;
            out[1] = -ab * det;
            out[2] = -ac * det;
            out[3] = aa * det;
            out[4] = (ac * aty - ad * atx) * det;
            out[5] = (ab * atx - aa * aty) * det;
            return out
        };
        mat2d.determinant = function (a) {
            return a[0] * a[3] - a[1] * a[2]
        };
        mat2d.multiply = function (out, a, b) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], b0 = b[0], b1 = b[1], b2 = b[2],
                b3 = b[3], b4 = b[4], b5 = b[5];
            out[0] = a0 * b0 + a2 * b1;
            out[1] = a1 * b0 + a3 * b1;
            out[2] = a0 * b2 + a2 * b3;
            out[3] = a1 * b2 + a3 * b3;
            out[4] = a0 * b4 + a2 * b5 + a4;
            out[5] = a1 * b4 + a3 * b5 + a5;
            return out
        };
        mat2d.mul = mat2d.multiply;
        mat2d.rotate = function (out, a, rad) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], s = Math.sin(rad), c = Math.cos(rad);
            out[0] = a0 * c + a2 * s;
            out[1] = a1 * c + a3 * s;
            out[2] = a0 * -s + a2 * c;
            out[3] = a1 * -s + a3 * c;
            out[4] = a4;
            out[5] = a5;
            return out
        };
        mat2d.scale = function (out, a, v) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], v0 = v[0], v1 = v[1];
            out[0] = a0 * v0;
            out[1] = a1 * v0;
            out[2] = a2 * v1;
            out[3] = a3 * v1;
            out[4] = a4;
            out[5] = a5;
            return out
        };
        mat2d.translate = function (out, a, v) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], v0 = v[0], v1 = v[1];
            out[0] = a0;
            out[1] = a1;
            out[2] = a2;
            out[3] = a3;
            out[4] = a0 * v0 + a2 * v1 + a4;
            out[5] = a1 * v0 + a3 * v1 + a5;
            return out
        };
        mat2d.str = function (a) {
            return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"
        };
        mat2d.frob = function (a) {
            return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1)
        };
        if (typeof exports !== "undefined") {
            exports.mat2d = mat2d
        }
        var mat3 = {};
        mat3.create = function () {
            var out = new GLMAT_ARRAY_TYPE(9);
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 1;
            out[5] = 0;
            out[6] = 0;
            out[7] = 0;
            out[8] = 1;
            return out
        };
        mat3.fromMat4 = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[4];
            out[4] = a[5];
            out[5] = a[6];
            out[6] = a[8];
            out[7] = a[9];
            out[8] = a[10];
            return out
        };
        mat3.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(9);
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            out[4] = a[4];
            out[5] = a[5];
            out[6] = a[6];
            out[7] = a[7];
            out[8] = a[8];
            return out
        };
        mat3.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            out[4] = a[4];
            out[5] = a[5];
            out[6] = a[6];
            out[7] = a[7];
            out[8] = a[8];
            return out
        };
        mat3.identity = function (out) {
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 1;
            out[5] = 0;
            out[6] = 0;
            out[7] = 0;
            out[8] = 1;
            return out
        };
        mat3.transpose = function (out, a) {
            if (out === a) {
                var a01 = a[1], a02 = a[2], a12 = a[5];
                out[1] = a[3];
                out[2] = a[6];
                out[3] = a01;
                out[5] = a[7];
                out[6] = a02;
                out[7] = a12
            } else {
                out[0] = a[0];
                out[1] = a[3];
                out[2] = a[6];
                out[3] = a[1];
                out[4] = a[4];
                out[5] = a[7];
                out[6] = a[2];
                out[7] = a[5];
                out[8] = a[8]
            }
            return out
        };
        mat3.invert = function (out, a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7],
                a22 = a[8], b01 = a22 * a11 - a12 * a21, b11 = -a22 * a10 + a12 * a20, b21 = a21 * a10 - a11 * a20,
                det = a00 * b01 + a01 * b11 + a02 * b21;
            if (!det) {
                return null
            }
            det = 1 / det;
            out[0] = b01 * det;
            out[1] = (-a22 * a01 + a02 * a21) * det;
            out[2] = (a12 * a01 - a02 * a11) * det;
            out[3] = b11 * det;
            out[4] = (a22 * a00 - a02 * a20) * det;
            out[5] = (-a12 * a00 + a02 * a10) * det;
            out[6] = b21 * det;
            out[7] = (-a21 * a00 + a01 * a20) * det;
            out[8] = (a11 * a00 - a01 * a10) * det;
            return out
        };
        mat3.adjoint = function (out, a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7],
                a22 = a[8];
            out[0] = a11 * a22 - a12 * a21;
            out[1] = a02 * a21 - a01 * a22;
            out[2] = a01 * a12 - a02 * a11;
            out[3] = a12 * a20 - a10 * a22;
            out[4] = a00 * a22 - a02 * a20;
            out[5] = a02 * a10 - a00 * a12;
            out[6] = a10 * a21 - a11 * a20;
            out[7] = a01 * a20 - a00 * a21;
            out[8] = a00 * a11 - a01 * a10;
            return out
        };
        mat3.determinant = function (a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7],
                a22 = a[8];
            return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20)
        };
        mat3.multiply = function (out, a, b) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7],
                a22 = a[8], b00 = b[0], b01 = b[1], b02 = b[2], b10 = b[3], b11 = b[4], b12 = b[5], b20 = b[6],
                b21 = b[7], b22 = b[8];
            out[0] = b00 * a00 + b01 * a10 + b02 * a20;
            out[1] = b00 * a01 + b01 * a11 + b02 * a21;
            out[2] = b00 * a02 + b01 * a12 + b02 * a22;
            out[3] = b10 * a00 + b11 * a10 + b12 * a20;
            out[4] = b10 * a01 + b11 * a11 + b12 * a21;
            out[5] = b10 * a02 + b11 * a12 + b12 * a22;
            out[6] = b20 * a00 + b21 * a10 + b22 * a20;
            out[7] = b20 * a01 + b21 * a11 + b22 * a21;
            out[8] = b20 * a02 + b21 * a12 + b22 * a22;
            return out
        };
        mat3.mul = mat3.multiply;
        mat3.translate = function (out, a, v) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7],
                a22 = a[8], x = v[0], y = v[1];
            out[0] = a00;
            out[1] = a01;
            out[2] = a02;
            out[3] = a10;
            out[4] = a11;
            out[5] = a12;
            out[6] = x * a00 + y * a10 + a20;
            out[7] = x * a01 + y * a11 + a21;
            out[8] = x * a02 + y * a12 + a22;
            return out
        };
        mat3.rotate = function (out, a, rad) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7],
                a22 = a[8], s = Math.sin(rad), c = Math.cos(rad);
            out[0] = c * a00 + s * a10;
            out[1] = c * a01 + s * a11;
            out[2] = c * a02 + s * a12;
            out[3] = c * a10 - s * a00;
            out[4] = c * a11 - s * a01;
            out[5] = c * a12 - s * a02;
            out[6] = a20;
            out[7] = a21;
            out[8] = a22;
            return out
        };
        mat3.scale = function (out, a, v) {
            var x = v[0], y = v[1];
            out[0] = x * a[0];
            out[1] = x * a[1];
            out[2] = x * a[2];
            out[3] = y * a[3];
            out[4] = y * a[4];
            out[5] = y * a[5];
            out[6] = a[6];
            out[7] = a[7];
            out[8] = a[8];
            return out
        };
        mat3.fromMat2d = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = 0;
            out[3] = a[2];
            out[4] = a[3];
            out[5] = 0;
            out[6] = a[4];
            out[7] = a[5];
            out[8] = 1;
            return out
        };
        mat3.fromQuat = function (out, q) {
            var x = q[0], y = q[1], z = q[2], w = q[3], x2 = x + x, y2 = y + y, z2 = z + z, xx = x * x2, yx = y * x2,
                yy = y * y2, zx = z * x2, zy = z * y2, zz = z * z2, wx = w * x2, wy = w * y2, wz = w * z2;
            out[0] = 1 - yy - zz;
            out[3] = yx - wz;
            out[6] = zx + wy;
            out[1] = yx + wz;
            out[4] = 1 - xx - zz;
            out[7] = zy - wx;
            out[2] = zx - wy;
            out[5] = zy + wx;
            out[8] = 1 - xx - yy;
            return out
        };
        mat3.normalFromMat4 = function (out, a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
                a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],
                b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10,
                b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12,
                b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30,
                b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32,
                det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
            if (!det) {
                return null
            }
            det = 1 / det;
            out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
            out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
            out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
            out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
            out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
            out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
            out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
            out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
            out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
            return out
        };
        mat3.str = function (a) {
            return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"
        };
        mat3.frob = function (a) {
            return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2))
        };
        if (typeof exports !== "undefined") {
            exports.mat3 = mat3
        }
        var mat4 = {};
        mat4.create = function () {
            var out = new GLMAT_ARRAY_TYPE(16);
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 0;
            out[5] = 1;
            out[6] = 0;
            out[7] = 0;
            out[8] = 0;
            out[9] = 0;
            out[10] = 1;
            out[11] = 0;
            out[12] = 0;
            out[13] = 0;
            out[14] = 0;
            out[15] = 1;
            return out
        };
        mat4.clone = function (a) {
            var out = new GLMAT_ARRAY_TYPE(16);
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            out[4] = a[4];
            out[5] = a[5];
            out[6] = a[6];
            out[7] = a[7];
            out[8] = a[8];
            out[9] = a[9];
            out[10] = a[10];
            out[11] = a[11];
            out[12] = a[12];
            out[13] = a[13];
            out[14] = a[14];
            out[15] = a[15];
            return out
        };
        mat4.copy = function (out, a) {
            out[0] = a[0];
            out[1] = a[1];
            out[2] = a[2];
            out[3] = a[3];
            out[4] = a[4];
            out[5] = a[5];
            out[6] = a[6];
            out[7] = a[7];
            out[8] = a[8];
            out[9] = a[9];
            out[10] = a[10];
            out[11] = a[11];
            out[12] = a[12];
            out[13] = a[13];
            out[14] = a[14];
            out[15] = a[15];
            return out
        };
        mat4.identity = function (out) {
            out[0] = 1;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 0;
            out[5] = 1;
            out[6] = 0;
            out[7] = 0;
            out[8] = 0;
            out[9] = 0;
            out[10] = 1;
            out[11] = 0;
            out[12] = 0;
            out[13] = 0;
            out[14] = 0;
            out[15] = 1;
            return out
        };
        mat4.transpose = function (out, a) {
            if (out === a) {
                var a01 = a[1], a02 = a[2], a03 = a[3], a12 = a[6], a13 = a[7], a23 = a[11];
                out[1] = a[4];
                out[2] = a[8];
                out[3] = a[12];
                out[4] = a01;
                out[6] = a[9];
                out[7] = a[13];
                out[8] = a02;
                out[9] = a12;
                out[11] = a[14];
                out[12] = a03;
                out[13] = a13;
                out[14] = a23
            } else {
                out[0] = a[0];
                out[1] = a[4];
                out[2] = a[8];
                out[3] = a[12];
                out[4] = a[1];
                out[5] = a[5];
                out[6] = a[9];
                out[7] = a[13];
                out[8] = a[2];
                out[9] = a[6];
                out[10] = a[10];
                out[11] = a[14];
                out[12] = a[3];
                out[13] = a[7];
                out[14] = a[11];
                out[15] = a[15]
            }
            return out
        };
        mat4.invert = function (out, a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
                a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],
                b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10,
                b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12,
                b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30,
                b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32,
                det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
            if (!det) {
                return null
            }
            det = 1 / det;
            out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
            out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
            out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
            out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
            out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
            out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
            out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
            out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
            out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
            out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
            out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
            out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
            out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
            out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
            out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
            out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
            return out
        };
        mat4.adjoint = function (out, a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
                a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
            out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);
            out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
            out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);
            out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
            out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
            out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);
            out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
            out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);
            out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);
            out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
            out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);
            out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
            out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
            out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);
            out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
            out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);
            return out
        };
        mat4.determinant = function (a) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
                a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],
                b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10,
                b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12,
                b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30,
                b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32;
            return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
        };
        mat4.multiply = function (out, a, b) {
            var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
                a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
            var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];
            out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
            out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
            out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
            out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
            b0 = b[4];
            b1 = b[5];
            b2 = b[6];
            b3 = b[7];
            out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
            out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
            out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
            out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
            b0 = b[8];
            b1 = b[9];
            b2 = b[10];
            b3 = b[11];
            out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
            out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
            out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
            out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
            b0 = b[12];
            b1 = b[13];
            b2 = b[14];
            b3 = b[15];
            out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
            out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
            out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
            out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
            return out
        };
        mat4.mul = mat4.multiply;
        mat4.translate = function (out, a, v) {
            var x = v[0], y = v[1], z = v[2], a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23;
            if (a === out) {
                out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
                out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
                out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
                out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]
            } else {
                a00 = a[0];
                a01 = a[1];
                a02 = a[2];
                a03 = a[3];
                a10 = a[4];
                a11 = a[5];
                a12 = a[6];
                a13 = a[7];
                a20 = a[8];
                a21 = a[9];
                a22 = a[10];
                a23 = a[11];
                out[0] = a00;
                out[1] = a01;
                out[2] = a02;
                out[3] = a03;
                out[4] = a10;
                out[5] = a11;
                out[6] = a12;
                out[7] = a13;
                out[8] = a20;
                out[9] = a21;
                out[10] = a22;
                out[11] = a23;
                out[12] = a00 * x + a10 * y + a20 * z + a[12];
                out[13] = a01 * x + a11 * y + a21 * z + a[13];
                out[14] = a02 * x + a12 * y + a22 * z + a[14];
                out[15] = a03 * x + a13 * y + a23 * z + a[15]
            }
            return out
        };
        mat4.scale = function (out, a, v) {
            var x = v[0], y = v[1], z = v[2];
            out[0] = a[0] * x;
            out[1] = a[1] * x;
            out[2] = a[2] * x;
            out[3] = a[3] * x;
            out[4] = a[4] * y;
            out[5] = a[5] * y;
            out[6] = a[6] * y;
            out[7] = a[7] * y;
            out[8] = a[8] * z;
            out[9] = a[9] * z;
            out[10] = a[10] * z;
            out[11] = a[11] * z;
            out[12] = a[12];
            out[13] = a[13];
            out[14] = a[14];
            out[15] = a[15];
            return out
        };
        mat4.rotate = function (out, a, rad, axis) {
            var x = axis[0], y = axis[1], z = axis[2], len = Math.sqrt(x * x + y * y + z * z), s, c, t, a00, a01, a02,
                a03, a10, a11, a12, a13, a20, a21, a22, a23, b00, b01, b02, b10, b11, b12, b20, b21, b22;
            if (Math.abs(len) < GLMAT_EPSILON) {
                return null
            }
            len = 1 / len;
            x *= len;
            y *= len;
            z *= len;
            s = Math.sin(rad);
            c = Math.cos(rad);
            t = 1 - c;
            a00 = a[0];
            a01 = a[1];
            a02 = a[2];
            a03 = a[3];
            a10 = a[4];
            a11 = a[5];
            a12 = a[6];
            a13 = a[7];
            a20 = a[8];
            a21 = a[9];
            a22 = a[10];
            a23 = a[11];
            b00 = x * x * t + c;
            b01 = y * x * t + z * s;
            b02 = z * x * t - y * s;
            b10 = x * y * t - z * s;
            b11 = y * y * t + c;
            b12 = z * y * t + x * s;
            b20 = x * z * t + y * s;
            b21 = y * z * t - x * s;
            b22 = z * z * t + c;
            out[0] = a00 * b00 + a10 * b01 + a20 * b02;
            out[1] = a01 * b00 + a11 * b01 + a21 * b02;
            out[2] = a02 * b00 + a12 * b01 + a22 * b02;
            out[3] = a03 * b00 + a13 * b01 + a23 * b02;
            out[4] = a00 * b10 + a10 * b11 + a20 * b12;
            out[5] = a01 * b10 + a11 * b11 + a21 * b12;
            out[6] = a02 * b10 + a12 * b11 + a22 * b12;
            out[7] = a03 * b10 + a13 * b11 + a23 * b12;
            out[8] = a00 * b20 + a10 * b21 + a20 * b22;
            out[9] = a01 * b20 + a11 * b21 + a21 * b22;
            out[10] = a02 * b20 + a12 * b21 + a22 * b22;
            out[11] = a03 * b20 + a13 * b21 + a23 * b22;
            if (a !== out) {
                out[12] = a[12];
                out[13] = a[13];
                out[14] = a[14];
                out[15] = a[15]
            }
            return out
        };
        mat4.rotateX = function (out, a, rad) {
            var s = Math.sin(rad), c = Math.cos(rad), a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], a20 = a[8],
                a21 = a[9], a22 = a[10], a23 = a[11];
            if (a !== out) {
                out[0] = a[0];
                out[1] = a[1];
                out[2] = a[2];
                out[3] = a[3];
                out[12] = a[12];
                out[13] = a[13];
                out[14] = a[14];
                out[15] = a[15]
            }
            out[4] = a10 * c + a20 * s;
            out[5] = a11 * c + a21 * s;
            out[6] = a12 * c + a22 * s;
            out[7] = a13 * c + a23 * s;
            out[8] = a20 * c - a10 * s;
            out[9] = a21 * c - a11 * s;
            out[10] = a22 * c - a12 * s;
            out[11] = a23 * c - a13 * s;
            return out
        };
        mat4.rotateY = function (out, a, rad) {
            var s = Math.sin(rad), c = Math.cos(rad), a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a20 = a[8],
                a21 = a[9], a22 = a[10], a23 = a[11];
            if (a !== out) {
                out[4] = a[4];
                out[5] = a[5];
                out[6] = a[6];
                out[7] = a[7];
                out[12] = a[12];
                out[13] = a[13];
                out[14] = a[14];
                out[15] = a[15]
            }
            out[0] = a00 * c - a20 * s;
            out[1] = a01 * c - a21 * s;
            out[2] = a02 * c - a22 * s;
            out[3] = a03 * c - a23 * s;
            out[8] = a00 * s + a20 * c;
            out[9] = a01 * s + a21 * c;
            out[10] = a02 * s + a22 * c;
            out[11] = a03 * s + a23 * c;
            return out
        };
        mat4.rotateZ = function (out, a, rad) {
            var s = Math.sin(rad), c = Math.cos(rad), a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4],
                a11 = a[5], a12 = a[6], a13 = a[7];
            if (a !== out) {
                out[8] = a[8];
                out[9] = a[9];
                out[10] = a[10];
                out[11] = a[11];
                out[12] = a[12];
                out[13] = a[13];
                out[14] = a[14];
                out[15] = a[15]
            }
            out[0] = a00 * c + a10 * s;
            out[1] = a01 * c + a11 * s;
            out[2] = a02 * c + a12 * s;
            out[3] = a03 * c + a13 * s;
            out[4] = a10 * c - a00 * s;
            out[5] = a11 * c - a01 * s;
            out[6] = a12 * c - a02 * s;
            out[7] = a13 * c - a03 * s;
            return out
        };
        mat4.fromRotationTranslation = function (out, q, v) {
            var x = q[0], y = q[1], z = q[2], w = q[3], x2 = x + x, y2 = y + y, z2 = z + z, xx = x * x2, xy = x * y2,
                xz = x * z2, yy = y * y2, yz = y * z2, zz = z * z2, wx = w * x2, wy = w * y2, wz = w * z2;
            out[0] = 1 - (yy + zz);
            out[1] = xy + wz;
            out[2] = xz - wy;
            out[3] = 0;
            out[4] = xy - wz;
            out[5] = 1 - (xx + zz);
            out[6] = yz + wx;
            out[7] = 0;
            out[8] = xz + wy;
            out[9] = yz - wx;
            out[10] = 1 - (xx + yy);
            out[11] = 0;
            out[12] = v[0];
            out[13] = v[1];
            out[14] = v[2];
            out[15] = 1;
            return out
        };
        mat4.fromQuat = function (out, q) {
            var x = q[0], y = q[1], z = q[2], w = q[3], x2 = x + x, y2 = y + y, z2 = z + z, xx = x * x2, yx = y * x2,
                yy = y * y2, zx = z * x2, zy = z * y2, zz = z * z2, wx = w * x2, wy = w * y2, wz = w * z2;
            out[0] = 1 - yy - zz;
            out[1] = yx + wz;
            out[2] = zx - wy;
            out[3] = 0;
            out[4] = yx - wz;
            out[5] = 1 - xx - zz;
            out[6] = zy + wx;
            out[7] = 0;
            out[8] = zx + wy;
            out[9] = zy - wx;
            out[10] = 1 - xx - yy;
            out[11] = 0;
            out[12] = 0;
            out[13] = 0;
            out[14] = 0;
            out[15] = 1;
            return out
        };
        mat4.frustum = function (out, left, right, bottom, top, near, far) {
            var rl = 1 / (right - left), tb = 1 / (top - bottom), nf = 1 / (near - far);
            out[0] = near * 2 * rl;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 0;
            out[5] = near * 2 * tb;
            out[6] = 0;
            out[7] = 0;
            out[8] = (right + left) * rl;
            out[9] = (top + bottom) * tb;
            out[10] = (far + near) * nf;
            out[11] = -1;
            out[12] = 0;
            out[13] = 0;
            out[14] = far * near * 2 * nf;
            out[15] = 0;
            return out
        };
        mat4.perspective = function (out, fovy, aspect, near, far) {
            var f = 1 / Math.tan(fovy / 2), nf = 1 / (near - far);
            out[0] = f / aspect;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 0;
            out[5] = f;
            out[6] = 0;
            out[7] = 0;
            out[8] = 0;
            out[9] = 0;
            out[10] = (far + near) * nf;
            out[11] = -1;
            out[12] = 0;
            out[13] = 0;
            out[14] = 2 * far * near * nf;
            out[15] = 0;
            return out
        };
        mat4.ortho = function (out, left, right, bottom, top, near, far) {
            var lr = 1 / (left - right), bt = 1 / (bottom - top), nf = 1 / (near - far);
            out[0] = -2 * lr;
            out[1] = 0;
            out[2] = 0;
            out[3] = 0;
            out[4] = 0;
            out[5] = -2 * bt;
            out[6] = 0;
            out[7] = 0;
            out[8] = 0;
            out[9] = 0;
            out[10] = 2 * nf;
            out[11] = 0;
            out[12] = (left + right) * lr;
            out[13] = (top + bottom) * bt;
            out[14] = (far + near) * nf;
            out[15] = 1;
            return out
        };
        mat4.lookAt = function (out, eye, center, up) {
            var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0],
                upy = up[1], upz = up[2], centerx = center[0], centery = center[1], centerz = center[2];
            if (Math.abs(eyex - centerx) < GLMAT_EPSILON && Math.abs(eyey - centery) < GLMAT_EPSILON && Math.abs(eyez - centerz) < GLMAT_EPSILON) {
                return mat4.identity(out)
            }
            z0 = eyex - centerx;
            z1 = eyey - centery;
            z2 = eyez - centerz;
            len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
            z0 *= len;
            z1 *= len;
            z2 *= len;
            x0 = upy * z2 - upz * z1;
            x1 = upz * z0 - upx * z2;
            x2 = upx * z1 - upy * z0;
            len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
            if (!len) {
                x0 = 0;
                x1 = 0;
                x2 = 0
            } else {
                len = 1 / len;
                x0 *= len;
                x1 *= len;
                x2 *= len
            }
            y0 = z1 * x2 - z2 * x1;
            y1 = z2 * x0 - z0 * x2;
            y2 = z0 * x1 - z1 * x0;
            len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
            if (!len) {
                y0 = 0;
                y1 = 0;
                y2 = 0
            } else {
                len = 1 / len;
                y0 *= len;
                y1 *= len;
                y2 *= len
            }
            out[0] = x0;
            out[1] = y0;
            out[2] = z0;
            out[3] = 0;
            out[4] = x1;
            out[5] = y1;
            out[6] = z1;
            out[7] = 0;
            out[8] = x2;
            out[9] = y2;
            out[10] = z2;
            out[11] = 0;
            out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
            out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
            out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
            out[15] = 1;
            return out
        };
        mat4.str = function (a) {
            return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"
        };
        mat4.frob = function (a) {
            return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2))
        };
        if (typeof exports !== "undefined") {
            exports.mat4 = mat4
        }
        var quat = {};
        quat.create = function () {
            var out = new GLMAT_ARRAY_TYPE(4);
            out[0] = 0;
            out[1] = 0;
            out[2] = 0;
            out[3] = 1;
            return out
        };
        quat.rotationTo = function () {
            var tmpvec3 = vec3.create();
            var xUnitVec3 = vec3.fromValues(1, 0, 0);
            var yUnitVec3 = vec3.fromValues(0, 1, 0);
            return function (out, a, b) {
                var dot = vec3.dot(a, b);
                if (dot < -.999999) {
                    vec3.cross(tmpvec3, xUnitVec3, a);
                    if (vec3.length(tmpvec3) < 1e-6) vec3.cross(tmpvec3, yUnitVec3, a);
                    vec3.normalize(tmpvec3, tmpvec3);
                    quat.setAxisAngle(out, tmpvec3, Math.PI);
                    return out
                } else if (dot > .999999) {
                    out[0] = 0;
                    out[1] = 0;
                    out[2] = 0;
                    out[3] = 1;
                    return out
                } else {
                    vec3.cross(tmpvec3, a, b);
                    out[0] = tmpvec3[0];
                    out[1] = tmpvec3[1];
                    out[2] = tmpvec3[2];
                    out[3] = 1 + dot;
                    return quat.normalize(out, out)
                }
            }
        }();
        quat.setAxes = function () {
            var matr = mat3.create();
            return function (out, view, right, up) {
                matr[0] = right[0];
                matr[3] = right[1];
                matr[6] = right[2];
                matr[1] = up[0];
                matr[4] = up[1];
                matr[7] = up[2];
                matr[2] = -view[0];
                matr[5] = -view[1];
                matr[8] = -view[2];
                return quat.normalize(out, quat.fromMat3(out, matr))
            }
        }();
        quat.clone = vec4.clone;
        quat.fromValues = vec4.fromValues;
        quat.copy = vec4.copy;
        quat.set = vec4.set;
        quat.identity = function (out) {
            out[0] = 0;
            out[1] = 0;
            out[2] = 0;
            out[3] = 1;
            return out
        };
        quat.setAxisAngle = function (out, axis, rad) {
            rad = rad * .5;
            var s = Math.sin(rad);
            out[0] = s * axis[0];
            out[1] = s * axis[1];
            out[2] = s * axis[2];
            out[3] = Math.cos(rad);
            return out
        };
        quat.add = vec4.add;
        quat.multiply = function (out, a, b) {
            var ax = a[0], ay = a[1], az = a[2], aw = a[3], bx = b[0], by = b[1], bz = b[2], bw = b[3];
            out[0] = ax * bw + aw * bx + ay * bz - az * by;
            out[1] = ay * bw + aw * by + az * bx - ax * bz;
            out[2] = az * bw + aw * bz + ax * by - ay * bx;
            out[3] = aw * bw - ax * bx - ay * by - az * bz;
            return out
        };
        quat.mul = quat.multiply;
        quat.scale = vec4.scale;
        quat.rotateX = function (out, a, rad) {
            rad *= .5;
            var ax = a[0], ay = a[1], az = a[2], aw = a[3], bx = Math.sin(rad), bw = Math.cos(rad);
            out[0] = ax * bw + aw * bx;
            out[1] = ay * bw + az * bx;
            out[2] = az * bw - ay * bx;
            out[3] = aw * bw - ax * bx;
            return out
        };
        quat.rotateY = function (out, a, rad) {
            rad *= .5;
            var ax = a[0], ay = a[1], az = a[2], aw = a[3], by = Math.sin(rad), bw = Math.cos(rad);
            out[0] = ax * bw - az * by;
            out[1] = ay * bw + aw * by;
            out[2] = az * bw + ax * by;
            out[3] = aw * bw - ay * by;
            return out
        };
        quat.rotateZ = function (out, a, rad) {
            rad *= .5;
            var ax = a[0], ay = a[1], az = a[2], aw = a[3], bz = Math.sin(rad), bw = Math.cos(rad);
            out[0] = ax * bw + ay * bz;
            out[1] = ay * bw - ax * bz;
            out[2] = az * bw + aw * bz;
            out[3] = aw * bw - az * bz;
            return out
        };
        quat.calculateW = function (out, a) {
            var x = a[0], y = a[1], z = a[2];
            out[0] = x;
            out[1] = y;
            out[2] = z;
            out[3] = Math.sqrt(Math.abs(1 - x * x - y * y - z * z));
            return out
        };
        quat.dot = vec4.dot;
        quat.lerp = vec4.lerp;
        quat.slerp = function (out, a, b, t) {
            var ax = a[0], ay = a[1], az = a[2], aw = a[3], bx = b[0], by = b[1], bz = b[2], bw = b[3];
            var omega, cosom, sinom, scale0, scale1;
            cosom = ax * bx + ay * by + az * bz + aw * bw;
            if (cosom < 0) {
                cosom = -cosom;
                bx = -bx;
                by = -by;
                bz = -bz;
                bw = -bw
            }
            if (1 - cosom > 1e-6) {
                omega = Math.acos(cosom);
                sinom = Math.sin(omega);
                scale0 = Math.sin((1 - t) * omega) / sinom;
                scale1 = Math.sin(t * omega) / sinom
            } else {
                scale0 = 1 - t;
                scale1 = t
            }
            out[0] = scale0 * ax + scale1 * bx;
            out[1] = scale0 * ay + scale1 * by;
            out[2] = scale0 * az + scale1 * bz;
            out[3] = scale0 * aw + scale1 * bw;
            return out
        };
        quat.invert = function (out, a) {
            var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3,
                invDot = dot ? 1 / dot : 0;
            out[0] = -a0 * invDot;
            out[1] = -a1 * invDot;
            out[2] = -a2 * invDot;
            out[3] = a3 * invDot;
            return out
        };
        quat.conjugate = function (out, a) {
            out[0] = -a[0];
            out[1] = -a[1];
            out[2] = -a[2];
            out[3] = a[3];
            return out
        };
        quat.length = vec4.length;
        quat.len = quat.length;
        quat.squaredLength = vec4.squaredLength;
        quat.sqrLen = quat.squaredLength;
        quat.normalize = vec4.normalize;
        quat.fromMat3 = function (out, m) {
            var fTrace = m[0] + m[4] + m[8];
            var fRoot;
            if (fTrace > 0) {
                fRoot = Math.sqrt(fTrace + 1);
                out[3] = .5 * fRoot;
                fRoot = .5 / fRoot;
                out[0] = (m[5] - m[7]) * fRoot;
                out[1] = (m[6] - m[2]) * fRoot;
                out[2] = (m[1] - m[3]) * fRoot
            } else {
                var i = 0;
                if (m[4] > m[0]) i = 1;
                if (m[8] > m[i * 3 + i]) i = 2;
                var j = (i + 1) % 3;
                var k = (i + 2) % 3;
                fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1);
                out[i] = .5 * fRoot;
                fRoot = .5 / fRoot;
                out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
                out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
                out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot
            }
            return out
        };
        quat.str = function (a) {
            return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"
        };
        if (typeof exports !== "undefined") {
            exports.quat = quat
        }
    })(shim.exports)
})(this);
var l,
    _ = ["performance", "now", "string", "number", "function", "object", "ms", "moz", "webkit", "o", "RequestAnimationFrame", "CancelAnimationFrame", "CancelRequestAnimationFrame", "", ".resize-triggers { ", "visibility: hidden; opacity: 0; } .resize-triggers, .resize-triggers > div, .contract-trigger:before { content: ' '; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }", "head", "style", "text/css", "px", "animationstart", "Webkit", "Moz", "O", "webkitAnimationStart", "oAnimationStart", "MSAnimationStart", "fakeelement", "AnimationName", "-", "resizeanim", "@", "keyframes ", " { from { opacity: 0; } to { opacity: 0; } } ", "animation: 1ms ", "; ", "onresize", "static", "relative", "div", "resize-triggers", "<div class='expand-trigger'><div></div></div><div class='contract-trigger'></div>", "scroll", "undefined", "Loading ", "%E5%8A%A0%E8%BD%BD%E4%B8%AD...", "%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E4%B8%AD%E2%80%A6", "Normal View", "%E6%AD%A3%E5%B8%B8%E8%A7%86%E8%A7%92", "%E3%83%8E%E3%83%BC%E3%83%9E%E3%83%AB%E3%83%93%E3%83%A5%E3%83%BC", "Little Planet View", "%E5%B0%8F%E8%A1%8C%E6%98%9F%E8%A7%86%E8%A7%92", "%E6%83%91%E6%98%9F%E3%83%91%E3%83%8E%E3%83%A9%E3%83%9E%E3%83%93%E3%83%A5%E3%83%BC", "Fullscreen", "%E5%85%A8%E5%B1%8F", "%E5%85%A8%E7%94%BB%E9%9D%A2ON", "Exit Fullscreen", "%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F", "%E5%85%A8%E7%94%BB%E9%9D%A2OFF", "video360", "fisheye", "littleplanet", "Sphere", "crystallball", "video2d", "Flat", "image/jpeg", "crossorigin", "anonymous", "2d", "image/png", "none", "WalkThrough", "Image", "sceneId", "sceneName", "myScene", "sceneTop", "sceneLeft", "sceneLng", "sceneLat", "sceneWidth", "sceneHeight", "sceneFileType", "sceneType", "Video", "sceneFilePath", "sence", "sceneModel", "sceneFormat", "videoType", "sceneSpeed", "sceneBlockModel", "isVideoAutoPlay", "isAutoRotate", "isVideoLoop", "minPan", "initPan", "maxPan", "minTilt", "initTilt", "maxTilt", "initFov", "minFov", "maxFov", "fovType", "Auto", "curFov", "curTilt", "curPan", "curRoll", "cameraAt", "isLittlePlanetEffect", "renderType", ".m3u8", "iphone", "ipod", "ipad", "Canvas", "h", "ame", "109", "509711211246110101116", "971", "1410111097991081111171004699111109", "is360pano", "Pyramid", "2D", "LR3D", "UD3D", "file:", "_", "120.87.10.21", "222.198.115.66", "192.168.0.110", "192.168.0.170", "container", "name", "UTPlayer", "width", "height", "zIndex", "loadingImg", "isMouseWheel", "isDBClick", "isDBViewPort", "DBViewIPD", "CRType", "CRImage", "initSceneId", "isGyro", "isDragAble", "dragStarMode", "mdown", "dragMode", "dragDirectionMode", "webGLDeepBuffer", "scenesArr", "isBlackWebGL", "fullScreenDom", "initOverCallBack", "loadedStartCallBack", "loadedCallBack", "drawWebGLCallBack", "errorCallBack", "sceneResizeCallBack", "scenePanTiltFovChangerCallBack", "sceneEventMoveCallBack", "sceneEventUpCallBack", "sceneEventClickCallBack", "sceneEventDownCallBack", "fullScreenChangeCallBack", "videoLoadProgressCallBack", "videoLoadStartCallBack", "videoPlayerCallBack", "videoCanPlayerCallBack", "videoUpdateCallBack", "videoLoadMetaDataCallBack", "videoTogglePlayCallBack", "setVideoCurTimeCallBack", "videoPlayEndCallBack", "X5VideoExitFullscreen", "X5VideoEnterFullscreen", "scenePlayDom", "absolute", "hidden", "100%", "black", "0px", "UserSelect", "TouchAction", "ContentZooming", "cubeDom", "android", "debug=true", "50%", "rgb(255, 255, 255)", "14px", "-50%", "rgb(0, 0, 0) 1px 1px 2px", "center", "block", "ver: ", " w： ", "h： ", " ua: ", "30%", "24px", "-25px", "110%", "280px", "-105px", "-140px", "white", "10px", "20px", "gray", "AppleWebKit/533", "WnGjwbEXli9G1E5VMCMNf1lVCZsR5AFEHthdbMSPSoxgcq7592oQC", "hos", "me", "10950", "9711211246110101116", "971141", "0111097991081111171004699111109", "s3tc", "etc1", "pvrtc", "webgl", "experimental-webgl", "moz-webgl", "webkit-3d", "\n", "Shader Error!", "aVertex", "aTexture", "aTextureScaleX", "aTextureScaleY", "aTextureOffsetX", "aTextureOffsetY", "uMMatrix", "uPMatrix", "fAlpha", "isBGRFormat", "ho", "109509", "711211246110101116", "971141011", "1097991081111171004699111109", "attribute vec3 aVertex; ", "attribute vec2 aTexture; ", "uniform mat4 uMMatrix; ", "uniform mat4 uPMatrix; ", "varying vec2 vTexture; ", "void main(){ ", "   gl_Position = uPMatrix * uMMatrix * vec4(aVertex,1.0); ", "   vTexture = aTexture; ", "}", "iVBORw0KGgoAAAANSUhEUgAAAKoAAABOCAMAAACHfX0kAAAAOVBMVEX", "1AAAAE3RSTlNACC81BgQeAAIBDBY+KiQROjIckTOrrgAABEZJREFUeF7szjENAAAMArB98+8YFRwkrYLez1BVLVFVVVVVVVVVVQ1v5rblOApD0QgLLAHYjv", "#ifdef GL_ES", "#ifdef GL_FRAGMENT_PRECISION_HIGH", "precision highp float;", "#else", "precision mediump float;", "#endif", "uniform float fAlpha;", "uniform int isBGRFormat;", "uniform float is360pano;", "uniform float aTextureScaleX;", "uniform float aTextureScaleY;", "uniform float aTextureOffsetX;", "uniform float aTextureOffsetY;", "uniform sampler2D uSampler;", "varying vec2 vTexture;", "void main(){", "   vec2 tScale = vec2(aTextureScaleX,aTextureScaleY);", "   vec2 tOffset = vec2(aTextureOffsetX,aTextureOffsetY);", "   float s=vTexture.x;", "   float t=vTexture.y;", "   if(is360pano == 0.0)", "   {", "       if(s<=0.5)", "       {", "           s=s*2.0;", "       }", "       else", "           s=2.0-s*2.0;", "   }", "   vec2 aText = vec2(s,t);", "   vec2 cTexture = (aText.xy * tScale.xy) + tOffset.xy;", "   vec4 c=texture2D(uSampler,vec2(cTexture.s,cTexture.t),-1.0);", "   gl_FragColor=bool(isBGRFormat) ? vec4(c.bgr,c.a*fAlpha) : vec4(c.rgb,c.a*fAlpha);", "9TMLW3YEFxvSKjLG57xpRGU+bfiNqXK3HdxKhtym", "bZI+vkTMsdbQb8AOStUJJdeGvE1qlyWfMWppxM+pAK7lzHSlvljsW", "aimsPtJIywjqohafAm4H7XGoMpyE2G5iE1Qj0r3o16k8YFkhSWOLlBlod+drCCpWJR2PlUXRFhWVDPUAcQ3oqaU0pazEtVSAaEOvZuWiuVFFVEd6Y2otQJmyqDVQkxYD7NYo7Aa8jXqs+JvHViSRT0lZEjETFVJ4UWmLU6UiuVFFVG1o3tRt", "dK3NUbXgPOQraCbjCi+kfmqF0+BOQMi46RPsgvFW1UHxV55VyNhWwFragi6ukDP0c9lFeA3R4xsuqPikT6+QFIGU4tK9kKOlFF1NqN4RzVHtVLOWxGJ+1w2ZrR3WOrUNXWpQPJGctSRFSAZJPEHFUsfNtzyOcJbV3tiy5dT8lKLXzbiNrsKXCKyrGkS0IP0wlIL4lYleRbubGIinAY0zlqfLVgmemYI+Jv+6BicbU9ombcjLBmqLFkOzkTDIvKee", "video", "webkit-playsinline", "x5-video-player-type", "h5", "x5-video-player-fullscreen", "false", "playsinline", "preload", "metadata", "rtmp://", ".m3u", "#EXT-X-ENDLIST", "error", "macintel", "safari", "muted", "%E8%B5%84%E6%BA%90%E5%8A%A0%E8%BD%BD%E9%94%99%E8%AF%AF!", "6NFJJ80mBCzGyDmf0b8bCAnBLBTCZBm1ugc66hTR5066tRRp446ddSpo04ddeqoU0edOupUADquG+pCzikkAAAAAElFTkSuQmCC", "8HAwPk5OTw8PAFAQEEAADAv79HcEwEAAAEAAAzMDCioKD8", "Pzd3NzR0NB8enr4+Pjp6emysbHSQ4", "Y2dlMhXdaszqbnfxBljyjsyRgDBJY9PlV5fV5KwxkbVe2Q1JV8amqOIe4ashse5mWlfKanJKigDG+m0uHqQrg1loJ6iEj09LyITLp1te5OXTRZqgEvSHtJZ55dzUSMq5PHTrx5K2XYIwQwWNSgQKFZlRnMMUFYfiGEgr4abhUbyp9myQ+ZdR4Y9QGXUMFyAmWPRANqjShrD+EOpqyB575ryr", "oZkUaUtNfPPolqUgub795o9qnkz", "ygq59q1N4TF0jhUG", "KfQRVnQ4cRdiMqvkDtlfgvojKzSuJRWK0Wo7LVoIaw3ohaM2sqpowIAIiZiL8T1qhPjXKNugDdiAqYiVVlqmVLKY2tARJxFNZSuxYVX6I+6o2o51lKeyMxZTglZMdWkTgKqxjXq0FNtdY2bHX7VdRnRDX17B3S", "SUyAMqxeWchVRiVxU70clbEJqcZywjKgCKiK0bmR1NyoTHN9n8T2zCMu0AbR61NrSYpLV", "Z0D+8kIWYUQl46hNdlbe3mVufr", "08FvrMr", "MIRhOVBGVnLDmqN+HtX", "WO36JdguSWVdFeQLVLLCmqOuFA+gvYC+ndgXjfpiLT1ckVK8FTyALlBXcsKao8Zj", "dKQWM9DOeRw", "Ly6Qvo9nnRVh7dm5a+q+9PRGO9GllhiostZVt20oDQLndM5dpaC6tMgLUvQKgPG9C2Bak+Br5Y+XfPoZ", "cCJqYHnDYCZ5sXvCzjBf", "/", "14px arial", "middle", "%u4E0A%u6D77%u6770%u56FE%u8F6F%u4EF6%u6280%u672F%u6709%u9650%u516C%u53F8%u7248%u6743%u6240%u6709", "7niu", "x", "a", ".jpg", "M", "A", "B", "U", "XFov", "YFov", "mover", "mouseover", "mousedown", "touchstart", "fullScreenChange", "pc", "keydown", "keyup", "contextmenu", "click", "mousewheel", "dblclick", "mousemove", "touchmove", "touchend", "mouseup", "mouseout", "TWP_rightTarget", "36px", "#000000", "12px", "cn", "SimSun", "Arial,Helvetica,sans-serif", "0px 0px 2px white", "3px", "pointer", "left", "rgba(255,255,255,0.85)", "1px", "4px solid #f1f1f1", "rgba(233, 232, 232,0.67)", "256px", "rgba(0, 0, 0, 0.5) 0px 0px 4px", "#dddddd 0px 0px 2px inset", "#e9e9e9", "#fafafa", "#cacaca", "40px", "#cdcdcd", "#f1f1f1", "#888787", "default", "visible", "progress", "timeupdate", "controls", "loop"];
!function () {
    if (!1 == _[0] in window && (window.performance = {}), Date.now = Date.now || function () {
        return (new Date).getTime()
    }, !1 == _[1] in window.performance) {
        var a = window.performance.timing && window.performance.timing.navigationStart ? window.performance.timing.navigationStart : Date.now();
        window.performance.now = function () {
            return Date.now() - a
        }
    }
}(), l = l || function () {
    var a = [];
    return {
        getAll: function () {
            return a
        }, eh: function () {
            a = []
        }, add: function (b) {
            a.push(b)
        }, remove: function (b) {
            b = a.indexOf(b), -1 !== b && a.splice(b, 1)
        }, update: function (b) {
            if (0 === a.length) return !1;
            var c = 0;
            for (b = void 0 !== b ? b : window.performance.now(); c < a.length;) a[c].update(b) ? c++ : a.splice(c, 1);
            return !0
        }
    }
}(), l.Z = function (a) {
    var p, b = {}, c = {}, d = {}, e = 1e3, f = 0, g = !1, h = null, i = l.M.Ma.Lc, j = l.$a.Ma, k = [], m = !1,
        n = null, o = null;
    for (p in a) b[p] = parseFloat(a[p], 10);
    this.ea = function (a, b) {
        return void 0 !== b && (e = b), c = a, this
    }, this.start = function (e) {
        l.add(this), g = !0, m = !1, h = void 0 !== e ? e : window.performance.now(), h += 0;
        for (var f in c) {
            if (c[f] instanceof Array) {
                if (0 === c[f].length) continue;
                c[f] = [a[f]].concat(c[f])
            }
            b[f] = a[f], !1 == b[f] instanceof Array && (b[f] *= 1), d[f] = b[f] || 0
        }
        return this
    }, this.stop = function () {
        return g ? (l.remove(this), g = !1, this.Jf(), this) : this
    }, this.Jf = function () {
        for (var a = 0, b = k.length; b > a; a++) k[a].stop()
    }, this.repeat = function (a) {
        return f = a, this
    }, this.ha = function (a) {
        return i = a, this
    }, this.da = function (a) {
        return n = a, this
    }, this.ja = function (a) {
        return o = a, this
    }, this.update = function (g) {
        var l, p, q, r, s;
        if (h > g) return !0;
        !1 === m && (m = !0), p = (g - h) / e, p = p > 1 ? 1 : p, q = i(p);
        for (l in c) r = b[l] || 0, s = c[l], s instanceof Array ? a[l] = j(s, q) : (_[2] === typeof s && (s = r + parseFloat(s, 10)), _[3] === typeof s && (a[l] = r + (s - r) * q));
        if (null !== n && n.call(a, q), 1 === p) {
            if (!(f > 0)) {
                for (null !== o && o.call(a), g = 0, l = k.length; l > g; g++) k[g].start(h + e);
                return !1
            }
            isFinite(f) && f--;
            for (l in d) _[2] === typeof c[l] && (d[l] += parseFloat(c[l], 10)), b[l] = d[l];
            h = g + 0
        }
        return !0
    }
}, l.M = {
    Ma: {
        Lc: function (a) {
            return a
        }
    }, na: {
        R: function (a) {
            return a * a
        }, H: function (a) {
            return a * (2 - a)
        }, ma: function (a) {
            return 1 > (a *= 2) ? .5 * a * a : -.5 * (--a * (a - 2) - 1)
        }
    }, zg: {
        R: function (a) {
            return a * a * a
        }, H: function (a) {
            return --a * a * a + 1
        }, ma: function (a) {
            return 1 > (a *= 2) ? .5 * a * a * a : .5 * ((a -= 2) * a * a + 2)
        }
    }, Cg: {
        R: function (a) {
            return a * a * a * a
        }, H: function (a) {
            return 1 - --a * a * a * a
        }, ma: function (a) {
            return 1 > (a *= 2) ? .5 * a * a * a * a : -.5 * ((a -= 2) * a * a * a - 2)
        }
    }, Dg: {
        R: function (a) {
            return a * a * a * a * a
        }, H: function (a) {
            return --a * a * a * a * a + 1
        }, ma: function (a) {
            return 1 > (a *= 2) ? .5 * a * a * a * a * a : .5 * ((a -= 2) * a * a * a * a + 2)
        }
    }, Eg: {
        R: function (a) {
            return 1 - Math.cos(a * Math.PI / 2)
        }, H: function (a) {
            return Math.sin(a * Math.PI / 2)
        }, ma: function (a) {
            return .5 * (1 - Math.cos(Math.PI * a))
        }
    }, Bg: {
        R: function (a) {
            return 0 === a ? 0 : Math.pow(1024, a - 1)
        }, H: function (a) {
            return 1 === a ? 1 : 1 - Math.pow(2, -10 * a)
        }, ma: function (a) {
            return 0 === a ? 0 : 1 === a ? 1 : 1 > (a *= 2) ? .5 * Math.pow(1024, a - 1) : .5 * (-Math.pow(2, -10 * (a - 1)) + 2)
        }
    }, yg: {
        R: function (a) {
            return 1 - Math.sqrt(1 - a * a)
        }, H: function (a) {
            return Math.sqrt(1 - --a * a)
        }, ma: function (a) {
            return 1 > (a *= 2) ? -.5 * (Math.sqrt(1 - a * a) - 1) : .5 * (Math.sqrt(1 - (a -= 2) * a) + 1)
        }
    }, Ag: {
        R: function (a) {
            var c, b = .1;
            return 0 === a ? 0 : 1 === a ? 1 : (!b || 1 > b ? (b = 1, c = .1) : c = .4 * Math.asin(1 / b) / (2 * Math.PI), -(b * Math.pow(2, 10 * --a) * Math.sin(2 * (a - c) * Math.PI / .4)))
        }, H: function (a) {
            var c, b = .1;
            return 0 === a ? 0 : 1 === a ? 1 : (!b || 1 > b ? (b = 1, c = .1) : c = .4 * Math.asin(1 / b) / (2 * Math.PI), b * Math.pow(2, -10 * a) * Math.sin(2 * (a - c) * Math.PI / .4) + 1)
        }, ma: function (a) {
            var c, b = .1;
            return 0 === a ? 0 : 1 === a ? 1 : (!b || 1 > b ? (b = 1, c = .1) : c = .4 * Math.asin(1 / b) / (2 * Math.PI), 1 > (a *= 2) ? -.5 * b * Math.pow(2, 10 * --a) * Math.sin(2 * (a - c) * Math.PI / .4) : .5 * b * Math.pow(2, -10 * --a) * Math.sin(2 * (a - c) * Math.PI / .4) + 1)
        }
    }, wg: {
        R: function (a) {
            return a * a * (2.70158 * a - 1.70158)
        }, H: function (a) {
            return --a * a * (2.70158 * a + 1.70158) + 1
        }, ma: function (a) {
            return 1 > (a *= 2) ? .5 * a * a * (3.5949095 * a - 2.5949095) : .5 * ((a -= 2) * a * (3.5949095 * a + 2.5949095) + 2)
        }
    }, Xb: {
        R: function (a) {
            return 1 - l.M.Xb.H(1 - a)
        }, H: function (a) {
            return 1 / 2.75 > a ? 7.5625 * a * a : 2 / 2.75 > a ? 7.5625 * (a -= 1.5 / 2.75) * a + .75 : 2.5 / 2.75 > a ? 7.5625 * (a -= 2.25 / 2.75) * a + .9375 : 7.5625 * (a -= 2.625 / 2.75) * a + .984375
        }, ma: function (a) {
            return .5 > a ? .5 * l.M.Xb.R(2 * a) : .5 * l.M.Xb.H(2 * a - 1) + .5
        }
    }
}, l.$a = {
    Ma: function (a, b) {
        var c = a.length - 1, d = c * b, e = Math.floor(d), f = l.$a.sb.Ma;
        return 0 > b ? f(a[0], a[1], d) : b > 1 ? f(a[c], a[c - 1], c - d) : f(a[e], a[e + 1 > c ? c : e + 1], d - e)
    }, xg: function (a, b) {
        for (var c = 0, d = a.length - 1, e = Math.pow, f = l.$a.sb.Sd, g = 0; d >= g; g++) c += e(1 - b, d - g) * e(b, g) * a[g] * f(d, g);
        return c
    }, Kc: function (a, b) {
        var c = a.length - 1, d = c * b, e = Math.floor(d), f = l.$a.sb.Kc;
        return a[0] === a[c] ? (0 > b && (e = Math.floor(d = c * (1 + b))), f(a[(e - 1 + c) % c], a[e], a[(e + 1) % c], a[(e + 2) % c], d - e)) : 0 > b ? a[0] - (f(a[0], a[0], a[1], a[1], -d) - a[0]) : b > 1 ? a[c] - (f(a[c], a[c], a[c - 1], a[c - 1], d - c) - a[c]) : f(a[e ? e - 1 : 0], a[e], a[e + 1 > c ? c : e + 1], a[e + 2 > c ? c : e + 2], d - e)
    }, sb: {
        Ma: function (a, b, c) {
            return (b - a) * c + a
        }, Sd: function (a, b) {
            var c = l.$a.sb.Ud;
            return c(a) / c(b) / c(a - b)
        }, Ud: function () {
            var a = [1];
            return function (b) {
                var d, c = 1;
                if (a[b]) return a[b];
                for (d = b; d > 1; d--) c *= d;
                return a[b] = c
            }
        }(), Kc: function (a, b, c, d, e) {
            a = .5 * (c - a), d = .5 * (d - b);
            var f = e * e;
            return (2 * b - 2 * c + a + d) * e * f + (-3 * b + 3 * c - 2 * a - d) * f + a * e + b
        }
    }
}, function (a) {
    _[4] === typeof define && define.Fg ? define([], function () {
        return l
    }) : _[5] === typeof exports ? module.exports = l : a.Qc = l
}(this), function () {
}.bind || (Function.prototype.bind = function (a) {
    var b = this, c = Array.prototype.slice.call(arguments);
    return function () {
        return b.apply(a, c.slice(1))
    }
}), function () {
    for (var a = 0, b = [_[6], _[7], _[8], _[9]], c = 0; c < b.length && !window.requestAnimationFrame; ++c) window.requestAnimationFrame = window[b[c] + _[10]], window.cancelAnimationFrame = window[b[c] + _[11]] || window[b[c] + _[12]];
    window.requestAnimationFrame || (window.requestAnimationFrame = function (b) {
        var c = (new Date).getTime(), d = Math.max(0, 16 - (c - a)), e = window.setTimeout(function () {
            b(c + d)
        }, d);
        return a = c + d, e
    }), window.cancelAnimationFrame || (window.cancelAnimationFrame = function (a) {
        clearTimeout(a)
    })
}(), function () {
    function a() {
        if (!c) {
            var a = (o ? o : _[13]) + _[14] + (p ? p : _[13]) + _[15],
                b = document.head || document.getElementsByTagName(_[16])[0], d = document.createElement(_[17]);
            d.type = _[18], d.styleSheet ? d.styleSheet.cssText = a : d.appendChild(document.createTextNode(a)), b.appendChild(d), c = !0
        }
    }

    var d, e, f, g, h, i, j, k, l, m, n, o, p, b = document.attachEvent, c = !1;
    if (!b) {
        if (d = function () {
            var a = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (a) {
                return window.setTimeout(a, 20)
            };
            return function (b) {
                return a(b)
            }
        }(), e = function () {
            var a = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout;
            return function (b) {
                return a(b)
            }
        }(), f = function (a) {
            var c, b = a.Fa;
            a = b.firstElementChild, b = b.lastElementChild, c = a.firstElementChild, b.scrollLeft = b.scrollWidth, b.scrollTop = b.scrollHeight, c.style.width = a.offsetWidth + 1 + _[19], c.style.height = a.offsetHeight + 1 + _[19], a.scrollLeft = a.scrollWidth, a.scrollTop = a.scrollHeight
        }, g = function (a) {
            var b = this;
            f(this), this.Oc && e(this.Oc), this.Oc = d(function () {
                (b.offsetWidth != b.tb.width || b.offsetHeight != b.tb.height) && (b.tb.width = b.offsetWidth, b.tb.height = b.offsetHeight, b.ab.forEach(function (c) {
                    c.call(b, a)
                }))
            })
        }, h = !1, i = _[13], j = _[20], k = [_[21], _[22], _[23], _[6]], l = [_[24], _[20], _[25], _[26]], m = _[13], m = document.createElement(_[27]), void 0 !== m.style.animationName && (h = !0), !1 === h) for (h = 0; h < k.length; h++) if (void 0 !== m.style[k[h] + _[28]]) {
            m = k[h], i = _[29] + m.toLowerCase() + _[29], j = l[h], h = !0;
            break
        }
        n = _[30], o = _[31] + i + _[32] + n + _[33], p = i + _[34] + n + _[35]
    }
    window.bb = function (c, d) {
        b ? c.attachEvent(_[36], d) : (c.Fa || (_[37] == getComputedStyle(c).position && (c.style.position = _[38]), a(), c.tb = {}, c.ab = [], (c.Fa = document.createElement(_[39])).className = _[40], c.Fa.innerHTML = _[41], c.appendChild(c.Fa), f(c), c.addEventListener(_[42], g, !0), j && c.Fa.addEventListener(j, function (a) {
            a.animationName == n && f(c)
        })), c.ab.push(d))
    }, window.Ig = function (a, c) {
        b ? a.detachEvent(_[36], c) : (a.ab.splice(a.ab.indexOf(c), 1), a.ab.length || (a.removeEventListener(_[42], g), a.Fa = !a.removeChild(a.Fa)))
    }
}(), function () {
    function a() {
    }

    function b(a, b, c) {
        return _[43] == typeof a[b] ? c : a[b]
    }

    var h, i, j, c = {en: _[44], cn: _[45], jp: _[46]}, d = {en: _[47], cn: _[48], jp: _[49]},
        e = {en: _[50], cn: _[51], jp: _[52]}, f = {en: _[53], cn: _[54], jp: _[55]},
        g = {en: _[56], cn: _[57], jp: _[58]};
    a.bb = function (a) {
        function b() {
            _[4] === typeof this.$c && this.$c.apply(this, arguments)
        }

        return b.prototype = a, b.constructor = b, b.prototype.api_dispose = function () {
            this.vc(), this.lf(this.P), this.O && (this.O.destroy(), this.O = null)
        }, b.prototype.api_getRoll = function () {
            return this.Zc
        }, b.prototype.api_changeFLength = function (a) {
            if (a *= 1, a > 100 && (a = 100), 0 > a && (a = 0), 30 > a) {
                this.Ba(0);
                var b = (30 - this.xa) / 30;
                this.fb(this.xa + b * (30 - a))
            } else 70 > a ? this.Ba(-.02 * (a - 30)) : (b = (150 - this.xa) / 30, this.Ba(-.8 + (-.9 + .8) / 30 * (a - 70)), this.gb(-3 * (a - 70)), this.fb(this.xa + b * (a - 70)));
            this.La(), 30 == a ? this.o.qa = _[59] : 55 == a ? this.o.qa = _[60] : 100 == a && (this.o.qa = _[61])
        }, b.prototype.api_getRenderType = function () {
            var a = _[13];
            return this.o && (a = this.o.qa), a
        }, b.prototype.api_changeRenderType = function (a) {
            _[60] === a ? (this.o && _[62] != this.o.T && this.api_setCurSceneModel(_[62]), this.api_fishEyeView()) : _[61] === a ? (this.o && _[62] != this.o.T && this.api_setCurSceneModel(_[62]), this.api_littlePlanet()) : _[63] === a ? (this.o && _[62] != this.o.T && this.api_setCurSceneModel(_[62]), this.api_crystallBallView()) : _[59] === a ? (this.o && _[62] != this.o.T && this.api_setCurSceneModel(_[62]), this.api_normalView()) : _[64] === a && this.o && this.api_setCurSceneModel(_[65])
        }, b.prototype.api_screenShot = function () {
            return this.preserveDrawingBuffer ? this.ua.toDataURL(_[66], 1) : _[13]
        }, b.prototype.api_readPixels = function (a, b, c, d) {
            var e = new Uint8Array(4 * c * d);
            return this.a.readPixels(a, b, c, d, this.a.RGBA, this.a.UNSIGNED_BYTE, e), e
        }, b.prototype.api_getVideoFrame = function (a) {
            var c, d, b = this.api_getVideoDom();
            return a && this.api_setVideoCurTime(a), b ? (a = b.videoWidth || 1920, c = b.videoHeight || 960, d = JTUtil.cDom(this.l([99, 97, 110, 118, 97, 115])), d.width = a, d.height = c, d.setAttribute(_[67], _[68]), d.getContext(_[69]).drawImage(b, 0, 0, d.width, d.height), d.toDataURL(_[70], 1)) : null
        }, b.prototype.api_stopAll = function () {
            this.I()
        }, b.prototype.api_autoPlay = function () {
            this.I(), this.Re && this.api_right()
        }, b.prototype.api_reset = function () {
            this.I();
            var a = this.mc, b = this.xa;
            this.s = parseInt(this.ib), this.u = parseInt(a), this.m = parseInt(b), this.Ca()
        }, b.prototype.api_left = function () {
            this.I(), this.aa = 37, this.C && this.api_CloseGyro()
        }, b.prototype.api_right = function () {
            this.I(), this.aa = 39, this.C && this.api_CloseGyro()
        }, b.prototype.api_up = function () {
            this.I(), this.aa = 38, this.C && this.api_CloseGyro()
        }, b.prototype.api_down = function () {
            this.I(), this.aa = 40, this.C && this.api_CloseGyro()
        }, b.prototype.api_zoomin = function () {
            this.I(), this.aa = 16, this.C && this.api_CloseGyro()
        }, b.prototype.api_zoomout = function () {
            this.I(), this.aa = 17, this.C && this.api_CloseGyro()
        }, b.prototype.api_previousScene = function () {
            this.I(), this.api_changerSceneByIndex(this.yb - 1)
        }, b.prototype.api_nextScene = function () {
            this.I(), this.api_changerSceneByIndex(this.yb + 1)
        }, b.prototype.api_changerSceneById = function (a, b, c, d) {
            this.I(), a = this.api_getSceneIndexById(a, b, c, d), this.api_changerSceneByIndex(a, b, c, d)
        }, b.prototype.api_changerSceneByIndex = function (a, b, c, d) {
            this.Ja = !1, this.g && this.g.pause(), this.I(), this.Sc(a, b, c, d)
        }, b.prototype.api_ToggleDragEffectMode = function () {
            return this.Ia = !this.Ia
        }, b.prototype.api_ToggleDragDirection = function () {
            return this.Bb = !this.Bb
        }, b.prototype.api_updateAngle = function (a) {
            this.yc(this.s + a)
        }, b.prototype.api_updateTiltAngle = function (a) {
            this.Ob(this.u + a)
        }, b.prototype.api_updatePanTiltAngle = function (a, b) {
            a = this.s + a, b = this.u + b, this.lb(a, b)
        }, b.prototype.api_setPanTiltFov = function (a, b, c) {
            this.Ca(a, b, c)
        }, b.prototype.api_getSceneIndexById = function (a) {
            for (var b, c = 0; c < this.ra.length; c++) if (this.ra[c].sceneId == a) {
                b = c;
                break
            }
            return b
        }, b.prototype.api_getCurSceneType = function () {
            return this.o.Aa
        }, b.prototype.api_setCurSceneModel = function (a) {
            this.o.T = a || _[62], a = this.Kd(this.o), this.Pd(a, this.o)
        }, b.prototype.api_getSceneDataById = function (a) {
            return a = this.api_getSceneIndexById(a), this.api_getSceneDataByIndex(a)
        }, b.prototype.api_getSceneDataByIndex = function (a) {
            return this.ra[a] ? this.ra[a] : this.ra[this.yb]
        }, b.prototype.api_addJsonSceneData = function (a) {
            var c, b = a.sceneId;
            return b ? (c = this.api_getSceneIndexById(b), isNaN(c) ? (this.ra.push(a), b) : b) : null
        }, b.prototype.api_delSceneById = function (a) {
            a = this.api_getSceneIndexById(a), -1 != a && this.ra.splice(a, 1)
        }, b.prototype.api_resize = function (a, b) {
            this.Ff(a, b), this.jf(), this.Nb && this.Nb()
        }, b.prototype.api_CloseGyro = function () {
            return i.isMobile ? (this.$ = 0, this.C = !1, this.api_setDragStatus(!0), stopGyroEffect(), this.Ca(), this.C) : this.C = !1
        }, b.prototype.api_OpenGyro = function () {
            return i.isMobile ? (addGyroEffect && addGyroEffect(this), this.C = !0) : this.C = !1
        }, b.prototype.api_ToggleGyro = function () {
            return this.C ? this.api_CloseGyro() : this.api_OpenGyro()
        }, b.prototype.api_getGyroStatus = function () {
            return this.C
        }, b.prototype.api_getViewPortStatus = function () {
            return this.ia
        }, b.prototype.api_setViewPortStatus = function (a) {
            this.ia = a ? !0 : !1, this.La(), this.Nb && this.Nb()
        }, b.prototype.api_getDragStatus = function () {
            return this.nc
        }, b.prototype.api_setDragStatus = function (a) {
            this.nc = !!a
        }, b.prototype.api_formatEffectParams = function (a) {
            var d, e, f, g, h, i, j, k, b = a[4] ? a[4] : _[71], c = a[5] ? a[5] : 2;
            switch (b) {
                case _[72]:
                    d = this.s, e = this.u, f = this.m, g = 1 * a[6], h = 1 * a[7], i = 1 * a[8], j = 1 * a[9], k = 1 * a[10], a = 1 * a[11];
                    break;
                default:
                    j = a.pan || a[1], k = a.B || a[2], a = a.A || a[3]
            }
            return {
                effectName: b,
                effectTime: 1 * c,
                nextPan: j,
                nextTilt: k,
                nextFov: a,
                sPan: d,
                sTilt: e,
                sFov: f,
                ePan: g,
                eTilt: h,
                eFov: i
            }
        }, b.prototype.api_walkDefaultTilt = function (a, b) {
            a = isNaN(a) ? 1 : a;
            var c = this;
            new l.Z({B: this.u}).ea({B: 0}, 1e3 * a).ha(l.M.Ma.Lc).da(function () {
                c.Ob(this.B)
            }).ja(function () {
                l.remove(this), _[4] == typeof b && b()
            }).start()
        }, b.prototype.api_walkThrough = function (a, b, c, d, e) {
            var g, h, i, j, k, f = this;
            a = isNaN(a) ? 1 : a, g = this.s, h = this.u, i = this.m, b -= g, j = b > 0 ? 1 : -1, b = Math.abs(b), b > 180 && (b = 360 - b, j *= -1), c = new l.Z({
                pan: g,
                B: h
            }).ea({pan: g + b * j, B: c}, 1e3 * (a / 2)).ha(l.M.na.H).da(function () {
                f.lb(this.pan, this.B)
            }).ja(function () {
                l.remove(this), k.start()
            }), k = new l.Z({A: i}).ea({A: d}, 1e3 * (a / 2)).ha(l.M.na.H).da(function () {
                f.Sa(this.A)
            }).ja(function () {
                l.remove(this), cancelAnimationFrame(null), f.api_stopAll(), _[4] == typeof e && e()
            }), this.C ? k.start() : c.start()
        }, b.prototype.api_walkThroughVR = function (a, b, c) {
            a = isNaN(a) ? 1 : a;
            var d = this;
            new l.Z({A: this.m}).ea({A: b}, 1e3 * a).ha(l.M.na.H).da(function () {
                d.Sa(this.A)
            }).ja(function () {
                l.remove(this), d.api_stopAll(), _[4] == typeof c && c()
            }).start()
        }, b.prototype.api_littlePlanet = function (a, b) {
            a = isNaN(a) ? 1 : a;
            var c = this;
            new l.Z({pan: this.s, B: this.u, A: this.m, N: this.K}).ea({
                pan: this.ib,
                B: -90,
                A: 150,
                N: -.9
            }, 1e3 * a).ha(l.M.na.H).da(function () {
                c.Ca(this.pan, this.B, this.A), c.Ba(this.N)
            }).ja(function () {
                l.remove(this), c.ya = !0, _[4] == typeof b && b()
            }).start()
        }, b.prototype.api_SpherePlanet = function (a, b) {
            a = isNaN(a) ? 1 : a;
            var c = this;
            new l.Z({pan: this.s, B: this.u, A: this.m, N: this.K}).ea({
                pan: 0,
                B: -45,
                A: 100,
                N: -.5
            }, 1e3 * a).ha(l.M.na.H).da(function () {
                c.Ca(this.pan, this.B, this.A), c.Ba(this.N)
            }).ja(function () {
                l.remove(this), c.ya = !0, _[4] == typeof b && b()
            }).start()
        }, b.prototype.api_normalView = function (a, b) {
            a = isNaN(a) ? 1 : a;
            var c = this;
            new l.Z({pan: this.s, B: this.u, A: this.m, N: this.K}).ea({
                pan: this.ib,
                B: 0,
                A: this.xa,
                N: 0
            }, 1e3 * a).ha(l.M.na.R).da(function () {
                c.Ca(this.pan, this.B, this.A), c.Ba(this.N)
            }).ja(function () {
                l.remove(this), c.ya = !1, _[4] == typeof b && b()
            }).start()
        }, b.prototype.api_fishEyeView = function (a, b) {
            a = isNaN(a) ? 1 : a;
            var c = this, d = this.s;
            new l.Z({pan: d, B: this.u, A: this.m, N: this.K}).ea({
                pan: d,
                B: 0,
                A: 90,
                N: -.7
            }, 1e3 * a).ha(l.M.na.R).da(function () {
                c.Ca(this.pan, this.B, this.A), c.Ba(this.N)
            }).ja(function () {
                l.remove(this), c.ya = !1, _[4] == typeof b && b()
            }).start()
        }, b.prototype.api_crystallBallView = function (a, b) {
            a = isNaN(a) ? 1 : a;
            var c = this, d = this.s, e = this.u;
            new l.Z({pan: d, B: e, A: this.m, N: this.K}).ea({
                pan: d,
                B: e,
                A: 90,
                N: -1.4
            }, 1e3 * a).ha(l.M.na.R).da(function () {
                c.Ca(this.pan, this.B, this.A), c.Ba(this.N)
            }).ja(function () {
                l.remove(this), c.ya = !1, _[4] == typeof b && b()
            }).start()
        }, b.prototype.api_initSceneEffect = function (a, b) {
            b = this.api_formatEffectParams(b), _[72] == b.ze ? this.api_walkThrough(a, (new Date).getTime(), b) : this.api_changerSceneByIndex(a, b.bh, b.dh, b.ah, b.ze, b.Lg)
        }, b.prototype.api_getCurSceneLngLat = function () {
            return {lng: this.rf, lat: this.qf}
        }, b.prototype.api_screenToSphere = function (a, b) {
            return a = this.Ge(a, b), {pan: a.pan, tilt: a.tilt, fov: this.m}
        }, b.prototype.api_sphereToScreen = function (a, b) {
            return a = this.api_get3DXYZByPanTilt(a, b), a = this.api_3DXYZToScreen(a.x, a.y, a.z), {
                x: a.x,
                y: a.y,
                roll: this.$,
                isShow: a.isInner,
                isInner: a.isInner
            }
        }, b.prototype.api_get3DXYZByPanTilt = function (a, b) {
            a += 90;
            var c = mat4.create();
            return mat4.rotateY(c, c, -(a * Math.PI / 180)), mat4.rotateX(c, c, b * Math.PI / 180), mat4.translate(c, c, [0, 0, -1]), b = vec3.transformMat4([], [0, 0, 0], c), {
                x: b[0],
                y: b[1],
                z: b[2]
            }
        }, b.prototype.api_3DXYZArrToScreen = function (a) {
            var c, d, b = a.Rc;
            if (a = a.qe, c = a.length, b = this.api_3DXYZToScreen(b[0], b[1], b[2]), b.isInner) return b;
            for (b = 0; c > b; b += 3) if (d = this.api_3DXYZToScreen(a[b], a[b + 1], a[b + 2]), d.isInner) return d;
            return {x: -1e3, y: -1e3, isInner: !1}
        }, b.prototype.api_3DXYZToScreen = function (a, b, c) {
            b = [a, b, c, 1], a = [];
            var d = [], e = this.width, f = this.height;
            return mat4.multiply(a, this.S, this.J), vec4.transformMat4(d, b, a), a = d[0], b = d[1], c = d[2], 0 > c ? {
                x: -1e3,
                y: -1e3,
                isInner: !1
            } : (this.ia && (this.width > this.height ? (e = .5 * this.width, f = this.height) : (e = this.width, f = .5 * this.height)), d = a / c / 2 * e + .5 * e, b = -(b / c / 2) * f + .5 * f, a = !0, (0 > d || 0 > b || d > e || b > f) && (a = !1), {
                x: d,
                y: b,
                isInner: a
            })
        }, b.prototype.api_getCurSceneId = function () {
            return this.X
        }, b.prototype.api_getVideoDom = function () {
            return this.g
        }, b.prototype.api_setVideoDom = function (a) {
            this.g = a
        }, b.prototype.api_getVideoLoadStartCallBack = function () {
            return this.Ic
        }, b.prototype.api_getVideoLoadProgressCallBack = function () {
            return this.pb
        }, b.prototype.api_getVideoPlayerCallBack = function () {
            return this.Jc
        }, b.prototype.api_getVideoUpdateCallBack = function () {
            return this.qb
        }, b.prototype.api_getVideoLoadMetaDataCallBack = function () {
            return this.Hc
        }, b.prototype.api_IsBlackWebGL = function () {
            return this.F
        }, b.prototype.api_setVideoPlay = function () {
            this.g && (this.hd ? this.Gg(1) : (this.g.ended && (this.g.currentTime = .1), this.g.play(), this.g.paused && setTimeout(this.api_setVideoPlay, 200), this.Ja = !0, this.Tb && this.Tb()))
        }, b.prototype.api_setVideoPause = function () {
            this.g.pause(), this.Ja = !1, this.Tb && this.Tb()
        }, b.prototype.api_setVideoMute = function (a) {
            this.g.muted = a
        }, b.prototype.api_getVideoMute = function () {
            return this.g.muted
        }, b.prototype.api_getVideoAutoPlayStatus = function () {
            return this.Ra
        }, b.prototype.api_getVideoPlayStatus = function () {
            return this.Ja
        }, b.prototype.api_setVideoToggle = function () {
            _[73] != this.Aa && (this.Ja ? this.api_setVideoPause() : this.api_setVideoPlay())
        }, b.prototype.api_setVideoCurTime = function (a) {
            this.g.currentTime = a, this.Ed && this.Ed()
        }, b.prototype.api_getVideoCurTime = function () {
            return this.g.currentTime
        }, b.prototype.api_getCurScenePTF = function () {
            return {pan: this.s, tilt: this.u, fov: this.m}
        }, b.prototype.api_getPlayDom = function () {
            return this.P
        }, b.prototype.api_getTargetDom = function () {
            return this.target
        }, b.prototype.api_getRotateStatus = function () {
            return this.aa ? !0 : !1
        }, b.prototype.api_getPlayerSize = function () {
            return {width: this.width, height: this.height, left: this.left, top: this.top}
        }, b.prototype.api_getFovLength = function () {
            return this.Yc()
        }, b.prototype.api_setMPMatrix = function (a, b) {
            this.oe(a, b)
        }, b.prototype.api_getAllSceneData = function () {
            return this.ra
        }, b.prototype.api_playerError = function (a) {
            4 == a ? this.Ue() : this.Gf(this.g, a), this.xc(null, !0), this.Pa(), this.Xc = !0, this.Cb && this.Cb(a)
        }, b.prototype.api_getWebGLInfo = function () {
            return {webGL: this.a, viewWidth: this.Ab, viewHeight: this.zb, vertex: this.v.Gc, texture: this.v.U}
        }, b.prototype.api_getViewPortSize = function () {
            var a = this.va();
            return {wh: a.Rd, w: a.i, h: a.j}
        }, b.prototype.api_getCurMPMatrix = function () {
            return {mm: this.J, pm: this.S}
        }, b.prototype.api_formatTexture = function (a, b) {
            this.Wa(a, b)
        }, b.prototype.api_uploadMatrixUniforms = function (a, b, c) {
            this.fa(a, b, c)
        }, b.prototype.api_setTextureSize = function (a, b, c, d) {
            this.G(a, b, c, d)
        }, b.prototype.api_loadVideo = function (a) {
            this.Ld(a)
        }, b.prototype.api_setDBViewIPD = function (a) {
            a = 1 * a || .05, 0 > a && (a = 0), a > .15 && (a = .15), this.Za = a
        }, b.prototype.api_getDBViewIPD = function () {
            return this.Za
        }, b.prototype.api_getVRMode = function () {
            return this.qc
        }, b.prototype.api_enterVRModel = function () {
            return this.I(), this.api_setViewPortStatus(!0), this.qc = !0, this.Za
        }, b.prototype.api_exitVRModel = function () {
            return this.api_setViewPortStatus(!1), this.qc = !1, this.Za
        }, b.prototype.api_setWebVRSensor = function (a, b, c) {
            this.Hb = a, this.xd = b, this.kc = c
        },b.prototype.api_changeVideoPath = function (a, b, c, d, e) {
            b = isNaN(b) ? this.g.currentTime : b, this.api_setVideoPause(), this.ne(a, b, d, e)
        },b.prototype.api_changeScenePath = function (a, b) {
            this.me(a, b)
        },b.prototype.api_enterFullScreen = function () {
            return JTUtil.isSupportFullScreen() ? (this.Ae(this.gc || this.target), void 0) : !1
        },b.prototype.api_exitFullScreen = function () {
            return JTUtil.isSupportFullScreen() ? (this.Be(this.gc || this.target), void 0) : !1
        },b.prototype.api_fullScreen = function () {
            return JTUtil.isSupportFullScreen() ? JTUtil.reqFullScreen(this.gc || this.target) : !1
        },b.prototype.api_getCurMVMatrix = function () {
            return this.J
        },b.prototype.api_createVideoDom = function () {
            return this.sc()
        },b.prototype.api_loadVideoDom = function (a, b, c, d, e) {
            this.Sb = {}, this.rc(a, b, c, d, e)
        },b.prototype.api_clearAll = function () {
            this.Ja = !1, this.g && this.g.pause(), this.g = null, this.api_stopAll(), this.Tc(this.X), this.Hd(), this.X = null
        },b.prototype.api_getGLMaxTextureSize = function () {
            return this.a.getParameter(this.a.MAX_TEXTURE_SIZE)
        },b
    }, j = a.bb({
        $c: function (a) {
            h = JTUtil.getLanguage(), i = JTUtil.getBrowser(), this.uf(a), this.Bf(), this.yf(), this.Af(a), this.vf(a), this.xf(), this.ve(), this.Ef(), this.re(), this.pe(), this.te() ? (this.vg(), this.Wd(this.P), this.Dc(), a = this.api_getSceneIndexById(this.Oe), this.bd && this.bd(), this.Sc(a), this.tg()) : (this.Dc(), this.api_playerError(0))
        }, Cf: function (a) {
            var c = {};
            return c.X = b(a, _[74], _[13]) || b(a, _[75], _[76]), c.gh = b(a, _[75], _[76]), c.hh = b(a, _[77], 0), c.fh = b(a, _[78], 0), c.rf = b(a, _[79], _[13]), c.qf = b(a, _[80], _[13]), c.Y = b(a, _[81], 0), c.W = b(a, _[82], 0), c.Aa = b(a, _[83], _[13]) || b(a, _[84], _[85]), c.Mb = b(a, _[86], _[87]), c.T = b(a, _[88], _[62]), c.L = b(a, _[89], _[13]) || b(a, _[90], _[13]), this.sf = b(a, _[91], 8), c.V = b(a, _[92], null), c.Ra = b(a, _[93], !1), c.Re = !!b(a, _[94], !1), c.Se = b(a, _[95], !0), c.md = b(a, _[96], 0), c.ib = b(a, _[97], 180), c.kd = b(a, _[98], 360), c.uc = b(a, _[99], -90), c.mc = b(a, _[100], 0), c.tc = b(a, _[101], 90), c.xa = b(a, _[102], 90), c.ld = b(a, _[103], 10), c.jd = b(a, _[104], 150), c.hb = b(a, _[105], _[106]), c.m = b(a, _[107], 0), c.u = b(a, _[108], 0), c.s = b(a, _[109], 0), c.$ = b(a, _[110], 0), c.K = b(a, _[111], 0), c.ya = b(a, _[112], !1), c.qa = b(a, _[113], _[59]), c.Va = _[106], c.ga = 0, c.za = !1, c
        }, Df: function (a, b, c, d) {
            if (a) {
                a.ya ? (a.s = 0, a.u = -90, a.m = 150, a.K = -.9, a.qa = _[61]) : (a.s = 1 * (b || a.ib), a.u = 1 * (c || a.mc), a.m = 1 * (d || a.xa), a.K = 1 * a.K || 0, this.C && (a.u = 0), _[60] === a.qa ? (a.u = 0, a.m = 90, a.K = -.7) : _[61] === a.qa ? (a.s = 0, a.u = -90, a.m = 150, a.K = -.9) : _[63] === a.qa ? (a.m = 90, a.K = -1.4) : _[64] === a.qa && (a.T = _[65]));
                for (var e in a) this[e] = a[e]
            } else this.md = 0, this.kd = this.ib = 180, this.uc = -90, this.mc = 0, this.xa = this.tc = 90, this.ld = 10, this.jd = 150, this.hb = _[106], this.m = 90, this.u = 0, this.s = 90, this.K = this.$ = 0
        }, Pe: function (a) {
            var b = this.ra.length;
            return a = 1 * a ? 1 * a : 0, a = 0 > a ? b - 1 : a >= b ? 0 : a, (b = this.api_getSceneDataByIndex(a)) && this.X != b.sceneId ? (this.bc = this.X, this.yb = a, (a = this.ic(this.bc)) && (a.J = this.J, a.S = this.S), this.Cf(b)) : void 0
        }, Ne: function (a) {
            if (a) {
                var b = i.plat, c = JTUtil.getFileExt(a.Mb), d = this.Da.toLowerCase();
                _[114] != c || _[115] != b && _[116] != b && _[117] != b || (a.Va = _[118]), (b = /AppleWebKit\/(\d+\.\d)/i.test(this.Da) ? 1 * RegExp.$1 : null) && b >= 602 && 604 > b && (a.Va = _[106]), d.match(/edge|msie|trident/) && (a.Va = _[118])
            }
        }, Xd: function (a) {
            a.xe = function () {
                _[118] == a.Va && _[85] == a.Aa ? this.Wb(a) : _[85] == a.Aa && this.Ja && this.Wb(a), this.Ub(a);
                var c = this.Pb(this.rb[_[119] + this.l([111, 115, 116, 110]) + _[120]]).join(_[13]);
                -1 == c.indexOf(_[121] + _[122]) && -1 == c.indexOf(_[123] + _[124]) && (this.a.uniform1f(this.v.Qe, b(a, _[125], 1)), _[62] == a.T ? this.eg(a) : _[126] == a.T ? this.dg(a) : _[65] == a.T && this.Vf(a))
            }.bind(this)
        }, Sc: function (a, b, d, e) {
            this.o = this.Pe(a), this.Ne(this.o), this.Nd(this.o), this.Df(this.o, b, d, e), this.o && (this.vb(), this.La(), a = this.Kd(this.o), this.Vb(a, this.o), this.Xd(this.o), this.Hd(), this.ka.push(this.o), this.Ta(decodeURI(c[h])), _[85] == this.o.Aa ? this.Ld(this.o) : _[73] == this.o.Aa && this.qg(this.o), this.fd && this.fd())
        }, Ae: function (a) {
            a = a ? a : document.documentElement, JTUtil.isFullScreen() || (a.mf && a.mf(), a.webkitRequestFullScreen && a.webkitRequestFullScreen(), a.msRequestFullscreen && a.msRequestFullscreen(), a.mozRequestFullScreen && a.mozRequestFullScreen(), a.hf && a.hf())
        }, Be: function () {
            JTUtil.isFullScreen() && (document.exitFullscreen && document.exitFullscreen(), document.bb && document.bb(), document.webkitCancelFullScreen && document.webkitCancelFullScreen(), document.msExitFullscreen && document.msExitFullscreen(), document.mozCancelFullScreen && document.mozCancelFullScreen(), document.Qc && document.Qc())
        }, Ee: function (a, b, c) {
            var d = 0;
            return _[73] == a && (d = 10), _[85] == a && (d = 20), a = 0, _[127] == b && (a = 0), _[128] == b && (a = 1), _[129] == b && (a = 2), c ? -1 : d + a
        }, Ie: function () {
            var a = _[13];
            try {
                a = window.top == window ? _[13] : top.location.href
            } catch (b) {
                a = _[13]
            }
            return a
        }, xc: function (a, b) {
            if (a && _[130] != this.rb.protocol) {
                var c = a.Y ? a.Y : 0, d = a.W ? a.W : 1, e = new Image,
                    f = this.l([47, 47, 97, 46, 117, 116, 111, 118, 114, 46, 99, 111, 109, 47, 116, 46, 112, 110, 103]),
                    g = encodeURIComponent(this.Ie()), h = this.l([49, 46, 48, 46, 49, 49, 57, 50]),
                    i = this.Zb.join(_[131]);
                a = this.Ee(a.Aa, a.L, b), b = (c / d).toFixed(2), c = c + _[131] + d, d = this.l([104]), f += this.l([63, 117, 116, 61, 49]), g && (f += this.l([38, 100, 61]) + g), h && (f += this.l([38, 118, 61]) + h), i && (f += this.l([38, 107, 61]) + i), a && (f += this.l([38, 116, 61]) + a), b && (f += this.l([38, 115, 61]) + b), f += this.l([38, 97, 61]) + 360, c && (f += this.l([38, 119, 61]) + c), d && (f += this.l([38, 109, 61]) + d), this.l(this.Zb), e.src = f
            }
        }, re: function () {
            var a = this.rb, b = a[this.l([104, 111, 115, 116, 110, 97, 109, 101])], c = this.Pb(b).join(_[13]);
            if (1 === this.Xa && _[43] !== typeof JTC && _[43] !== typeof JTR && 1 == JTR) this.b = this.c = !1, this.f = !0; else if (_[132] === b || _[133] === b || _[134] === b || _[135] === b) this.b = this.c = !1, this.f = !0; else {
                if (_[130] == a[this.l([112, 114, 111, 116, 111, 99, 111, 108])]) return !1;
                for (a = -1, b = 0; b < this.lc.length; b++) if (-1 != c.indexOf(this.lc[b].join(_[13]))) {
                    a = b;
                    break
                }
                -1 !== a && (this.Zb = this.lc[a], 0 === a || 4 === a || 5 === a || 46 === a || 47 === a || 42 === a || 43 === a || 69 === a || 70 === a || 75 === a || 76 === a || 77 === a || 81 === a || 82 === a || 83 === a || 96 === a || 97 === a ? this.b = this.c = !1 : 6 === a || 11 === a || 12 === a || 16 === a || 18 === a || 19 === a || 20 === a || 21 === a || 29 === a || 30 === a || 31 === a || 34 == a || 38 == a ? (this.c = !1, this.f = this.b = !0) : 2 === a || 22 === a || 24 === a || 25 === a || 28 == a || 40 == a || 39 === a ? this.c = !1 : 10 === a || 23 === a || 32 === a || 33 === a || 53 === a || 48 === a || 49 === a || 50 === a || 61 === a || 62 === a || 65 === a || 68 === a || 7 === a || 8 === a || 9 === a || 13 === a || 71 === a || 72 === a || 73 === a || 90 === a || 93 === a || 94 === a || 26 === a || 101 === a ? (this.b = this.c = !1, this.f = !0) : 1 === a ? (this.c = !1, this.f = this.b = !0) : 149 === a ? (this.b = this.c = !1, this.f = !0) : 148 === a ? (this.b = this.c = !1, this.f = !0) : 147 === a ? (this.b = this.c = !1, this.f = !0) : 146 === a ? (this.b = this.c = !1, this.f = !0) : 145 === a ? (this.b = this.c = !1, this.f = !0) : 144 === a ? (this.b = this.c = !1, this.f = !0) : 143 === a ? this.f = this.b = this.c = !1 : 142 === a ? (this.b = this.c = !1, this.f = !0) : 141 === a ? (this.b = this.c = !1, this.f = !0) : 139 === a || 140 === a ? (this.b = this.c = !1, this.f = !0) : 3 === a ? (this.b = this.c = !1, this.f = !0) : 138 === a ? (this.b = this.c = !1, this.f = !0) : 67 === a ? (this.b = this.c = !1, this.f = !0) : 137 === a ? (this.b = this.c = !1, this.f = !0) : 134 === a ? (this.b = this.c = !1, this.f = !0) : 130 === a || 131 === a || 132 === a ? (this.b = this.c = !1, this.f = !0) : 129 === a ? (this.b = this.c = !1, this.f = !0) : 128 === a ? (this.b = this.c = !1, this.f = !0) : 102 === a || 60 === a ? (this.b = this.c = !1, this.f = !0) : 126 === a ? (this.b = this.c = !1, this.f = !0) : 125 === a ? (this.b = this.c = !1, this.f = !0) : 124 === a ? (this.b = this.c = !1, this.f = !0) : 123 === a ? (this.b = this.c = !1, this.f = !0) : 122 === a ? (this.b = this.c = !1, this.f = !0) : 120 === a ? (this.b = this.c = !1, this.f = !0) : 117 === a || 118 === a ? (this.b = this.c = !1, this.f = !0) : 116 === a ? (this.b = this.c = !1, this.f = !0) : 115 === a || 136 === a ? (this.b = this.c = !1, this.f = !0) : 106 === a || 107 === a ? (this.b = this.c = !1, this.f = !0) : 108 === a ? (this.b = this.c = !1, this.f = !0) : 110 === a ? (this.b = this.c = !1, this.f = !0) : 112 === a ? (this.b = this.c = !1, this.f = !0) : 14 === a || 15 === a || 17 === a || 27 === a ? this.f = !0 : 86 === a || 85 === a ? (this.b = this.c = !1, this.f = !0) : (c = (new Date).getTime(), 92 === a || 93 === a ? 1528694122881 > c && (this.f = this.b = this.c = !1) : 35 === a ? 1488162183430 > c && (this.c = !1, this.f = this.b = !0) : 36 === a ? 1499331710824 > c && (this.c = !1, this.f = this.b = !0) : 37 === a ? 1491472632606 > c && (this.c = !1, this.f = this.b = !0) : 41 === a ? 1525153217345 > c && (this.b = this.c = !1) : 44 === a || 45 === a ? 1525943823575 > c && (this.b = this.c = !1, this.f = !0) : 51 === a ? 1527412065494 > c && (this.f = this.b = this.c = !1) : 52 === a ? 1527412065494 > c && (this.b = this.c = !1, this.f = !0) : 58 === a ? 1527821843058 > c && (this.b = this.c = !1, this.f = !0) : 59 === a ? 1528695136486 > c && (this.b = this.c = !1, this.f = !0) : 63 === a ? 149266983e4 > c && (this.b = this.c = !1, this.f = !0) : 64 === a ? 15238944e5 > c && (this.b = this.c = !1, this.f = !0) : 66 === a ? 1529823637044 > c && (this.b = this.c = !1, this.f = !0) : 74 === a ? 15664896e5 > c && (this.b = this.c = !1, this.f = !0) : 78 === a || 79 === a ? 1532415403613 > c && (this.b = this.c = !1, this.f = !0) : 80 === a ? 1503283406411 > c && (this.f = !0) : 84 === a ? 15715008e5 > c && (this.b = this.c = !1, this.f = !0) : 87 === a || 88 === a || 89 === a ? 1539238217873 > c && (this.b = this.c = !1, this.f = !0) : 98 === a ? 1522317702383 > c && (this.b = !1, this.f = !0) : 99 === a ? 1549009809442 > c && (this.b = this.c = !1) : 100 === a ? 1551944613942 > c && (this.b = this.c = !1, this.f = !0) : 103 === a || 109 === a ? 1555988875541 > c && (this.b = this.c = !1, this.f = !0) : 104 === a ? 16065792e5 > c && (this.b = this.c = !1, this.f = !0) : 43 === a ? 1531152e6 > c && (this.b = this.c = !1, this.f = !0) : 105 === a ? 15712416e5 > c && (this.b = this.c = !1, this.f = !0) : 111 === a ? 15530112e5 > c && (this.f = this.b = this.c = !1) : 113 === a ? 1581696e6 > c && (this.b = this.c = !1, this.f = !0) : 114 === a ? 1583424e6 > c && (this.b = this.c = !1, this.f = !0) : 119 === a ? (this.b = this.c = !1, this.f = !0) : 121 === a ? 161712e7 > c && (this.b = this.c = !1, this.f = !0) : 127 === a ? 16200576e5 > c && (this.b = this.c = !1, this.f = !0) : 133 === a ? 156528e7 > c && (this.b = this.c = !1, this.f = !0) : 135 === a && 15722784e5 > c && (this.f = this.b = this.c = !0)))
            }
        }, Pb: function (a) {
            for (var b = [], c = 0; c < a.length; c++) b.push(a.charCodeAt(c));
            return b
        }, l: function (a) {
            for (var b = [], c = 0; c < a.length; c++) b.push(String.fromCharCode(a[c]));
            return b.join(_[13])
        }, Yg: function () {
            return [49, 46, 48, 46, 49, 49, 57, 50]
        }, jc: function () {
            return this.l(1 === this.Xa ? [74, 73, 69, 84, 85, 83, 79, 70, 84, 32, 83, 68, 75, 32] : [85, 116, 111, 86, 82, 32, 80, 108, 97, 121, 101, 114, 32, 83, 68, 75, 32]) + this.l([49, 46, 48, 46, 49, 49, 57, 50])
        }, uf: function (a) {
            this.ue = b(a, _[136], document.body), this.name = b(a, _[137], _[138]), this.width = b(a, _[139], 800), this.height = b(a, _[140], 600), this.zIndex = b(a, _[141], 0), this.Kb = b(a, _[142], _[13]), this.Da = navigator.userAgent, this.Kb && (c.en = this.Kb, c.cn = this.Kb, c.jp = this.Kb)
        }, Af: function (a) {
            this.oc = b(a, _[143], !0), this.dd = b(a, _[144], !0), this.ia = b(a, _[145], !1), this.qc = !1, this.Za = b(a, _[146], 0), this.Xa = b(a, _[147], 0), this.Td = b(a, _[148], _[13]), this.Oe = b(a, _[149], _[13]), this.C = b(a, _[150], !1), this.nc = b(a, _[151], !0), this.fc = b(a, _[152], _[153]), this.Ia = b(a, _[154], !1), this.cc = .1, this.Bb = b(a, _[155], !0), this.preserveDrawingBuffer = b(a, _[156], !1), this.ra = b(a, _[157], []), this.F = b(a, _[158], !1), this.jb = this.f = !1, this.Zb = [102, 114, 101, 101], this.c = !0, this.kb = !1, this.b = !0, this.gc = b(a, _[159], null), i.isMobile || (this.C = !1)
        }, vf: function (a) {
            this.bd = b(a, _[160], null), this.fd = b(a, _[161], null), this.Jb = b(a, _[162], null), this.Uc = b(a, _[163], null), this.Cb = b(a, _[164], null), this.Nb = b(a, _[165], null), this.Dd = b(a, _[166], null), this.Bd = b(a, _[167], null), this.Cd = b(a, _[168], null), this.zd = b(a, _[169], null), this.Ad = b(a, _[170], null), this.Db = b(a, _[171], null), this.pb = b(a, _[172], null), this.Ic = b(a, _[173], null), this.Jc = b(a, _[174], null), this.Rb = b(a, _[175], null), this.qb = b(a, _[176], null), this.Hc = b(a, _[177], null), this.Tb = b(a, _[178], null), this.Ed = b(a, _[179], null), this.Gd = b(a, _[180], null), this.Nc = b(a, _[181], null), this.Mc = b(a, _[182], null)
        }, zf: function () {
            var b, c, a = DomUtil.getSize(this.target);
            this.api_resize(a.width, a.height), window.bb(this.target, EventUtil.debounce(function () {
                var a = DomUtil.getSize(this.target);
                this.api_resize(a.width, a.height)
            }, 100, !0).bind(this)), b = this, c = new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(function () {
                JTUtil.gId(_[183]) || (b.api_setVideoPause(), b.g = null, c.disconnect())
            }), c.observe(document.body, {childList: !0, subtree: !0})
        }, Bf: function () {
            this.S = mat4.create(), this.J = mat4.create(), this.yb = this.zb = this.Ab = 0, this.rb = window.location, this.bc = null
        }, yf: function () {
            this.Fb = this.pa = !1, this.Qa = this.Ga = this.Ka = this.aa = this.xb = this.wb = this.Ac = this.zc = 0, this.lc = [[99, 104, 105, 110, 97, 110, 101, 119, 115, 46, 99, 111, 109], [99, 110, 116, 118, 46, 99, 110], [105, 112, 97, 110, 100, 97, 46, 99, 111, 109], [56, 49, 46, 99, 110], [55, 50, 48, 121, 117, 110, 46, 99, 111, 109], [55, 50, 48, 115, 116, 97, 116, 105, 99, 46, 99, 111, 109], [117, 116, 111, 118, 114, 46, 99, 111, 109], [122, 104, 111, 110, 103, 103, 117, 111, 119, 97, 110, 103, 115, 104, 105, 46, 99, 111, 109], [120, 105, 110, 104, 117, 97, 97, 112, 112, 46, 99, 111, 109], [120, 105, 110, 104, 117, 97, 109, 109, 46, 110, 101, 116], [104, 117, 97, 119, 101, 105, 46, 99, 111, 109], [115, 110, 97, 105, 108, 118, 114, 46, 99, 111, 109], [119, 104, 97, 108, 101, 121, 45, 118, 114, 46, 99, 111, 109], [56, 55, 56, 55, 48, 46, 99, 111, 109], [122, 106, 111, 108, 46, 99, 111, 109], [115, 111, 98, 101, 121, 99, 108, 111, 117, 100, 46, 99, 111, 109], [117, 116, 111, 118, 114, 46, 99, 110], [117, 116, 111, 118, 114, 104, 108, 115, 112, 108, 97, 121, 46, 100, 110, 105, 111, 110, 46, 99, 111, 109], [119, 121, 122, 99, 46, 99, 111, 109], [103, 107, 107, 46, 99, 110], [117, 112, 52, 103, 46, 99, 111, 109], [107, 101, 122, 104, 117, 97, 110, 106, 105, 97, 46, 99, 111, 109], [99, 108, 105, 99, 107, 45, 118, 46, 99, 111, 109], [109, 105, 103, 117, 99, 108, 111, 117, 100, 46, 99, 111, 109], [104, 117, 105, 120, 105, 97, 111, 101, 114, 46, 99, 111, 109], [98, 97, 111, 109, 105, 104, 117, 97, 46, 99, 111, 109], [99, 122, 116, 118, 46, 99, 111, 109], [120, 105, 110, 104, 117, 105, 119, 101, 110, 46, 99, 111, 109], [118, 114, 99, 100, 107, 106, 46, 99, 111, 109], [99, 121, 106, 120, 46, 99, 111, 109], [116, 111, 117, 99, 104, 101, 118, 46, 99, 111, 109], [116, 115, 121, 116, 118, 46, 99, 111, 109, 46, 99, 110], [108, 105, 119, 118, 114, 46, 99, 111, 109], [104, 108, 115, 46, 108, 105, 119, 46, 100, 110, 105, 111, 110, 46, 99, 111, 109], [99, 99, 116, 118, 46, 99, 111, 109], [115, 117, 112, 101, 114, 115, 116, 97, 114, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 115, 46, 99, 111, 109], [109, 111, 106, 105, 110, 103, 46, 99, 110], [108, 101, 99, 108, 111, 117, 100, 46, 99, 111, 109], [122, 101, 114, 111, 109, 111, 110, 105, 116, 111, 114, 46, 99, 111, 109], [106, 105, 110, 103, 106, 105, 114, 105, 98, 97, 111, 46, 99, 110], [106, 102, 106, 98, 97, 112, 112, 46, 99, 110], [118, 114, 45, 115, 104, 111, 119, 115, 46, 99, 110], [109, 97, 100, 118, 51, 54, 48, 46, 99, 111, 109], [109, 97, 100, 118, 51, 54, 48, 46, 99, 110], [119, 101, 99, 104, 97, 110, 103, 46, 110, 101, 116], [122, 109, 105, 116, 105, 46, 99, 111, 109], [112, 101, 97, 114, 118, 105, 100, 101, 111, 46, 99, 111, 109], [112, 101, 97, 114, 109, 101, 100, 105, 97, 46, 99, 110], [116, 97, 97, 103, 111, 111, 46, 99, 111, 109], [116, 97, 97, 103, 111, 111, 46, 99, 110], [120, 105, 97, 111, 121, 117, 97, 110, 121, 111, 117, 46, 99, 110], [100, 100, 105, 112, 105, 110, 103, 46, 99, 111, 109], [119, 111, 110, 105, 117, 99, 108, 111, 117, 100, 46, 99, 111, 109], [115, 104, 105, 107, 111, 110, 103, 46, 116, 118], [117, 112, 97, 110, 111, 46, 99, 110], [117, 112, 97, 110, 111, 118, 114, 46, 99, 111, 109], [117, 112, 97, 110, 111, 46, 108, 105, 118, 101], [117, 112, 97, 110, 111, 46, 110, 101, 116], [109, 105, 97, 111, 109, 114, 46, 99, 111, 109], [107, 101, 121, 110, 111, 46, 99, 110], [104, 111, 115, 118, 114, 46, 99, 110], [101, 97, 115, 121, 118, 97, 97, 115, 46, 99, 111, 109], [121, 122, 98, 46, 116, 118], [112, 121, 114, 97, 109, 105, 100, 118, 114, 46, 99, 110], [110, 103, 98, 108, 97, 98, 46, 99, 111, 109], [121, 105, 122, 104, 105, 98, 111, 46, 116, 118], [122, 115, 108, 105, 118, 101, 46, 116, 111, 112], [99, 105, 116, 121, 56, 46, 99, 111, 109], [103, 111, 116, 110, 46, 99, 110], [120, 105, 97, 111, 121, 105, 46, 99, 111, 109], [121, 105, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 46, 99, 111, 109], [120, 105, 97, 111, 112, 97, 110, 111, 46, 99, 111, 109], [116, 97, 97, 103, 111, 111, 46, 110, 101, 116], [99, 104, 105, 110, 97, 109, 111, 110, 115, 46, 99, 111, 109], [55, 50, 48, 118, 118, 46, 99, 111, 109], [102, 112, 104, 105, 115, 46, 99, 111, 109], [120, 105, 110, 121, 105, 108, 105, 110, 107, 46, 99, 111, 109], [110, 101, 116, 105, 109, 101, 46, 99, 111, 109, 46, 99, 110], [114, 105, 112, 112, 108, 101, 45, 99, 111, 114, 112, 46, 99, 111, 109], [99, 104, 97, 110, 101, 108, 46, 99, 111, 109, 46, 99, 110], [114, 101, 97, 100, 105, 116, 101, 99, 46, 99, 111, 109], [100, 97, 114, 108, 105, 110, 103, 46, 99, 110], [112, 114, 111, 116, 114, 117, 108, 121, 46, 99, 111, 109, 46, 99, 110], [98, 113, 108, 110, 118, 46, 99, 111, 109, 46, 99, 110], [116, 118, 49, 56, 57, 46, 99, 111, 109], [111, 117, 114, 106, 105, 97, 110, 103, 115, 117, 110, 46, 99, 111, 109], [106, 115, 116, 118, 46, 99, 111, 109], [122, 104, 105, 49, 48, 46, 99, 111, 109], [122, 104, 105, 104, 101, 100, 111, 110, 103, 102, 97, 110, 103, 46, 99, 111, 109], [122, 104, 119, 101, 98, 105, 110, 97, 114, 46, 99, 111, 109], [122, 111, 108, 46, 99, 111, 109, 46, 99, 110], [49, 48, 48, 56, 54, 46, 99, 110], [115, 109, 97, 114, 116, 46, 99, 111, 109], [106, 97, 101, 97, 112, 112, 46, 99, 111, 109], [99, 99, 116, 118, 52, 103, 46, 99, 111, 109], [105, 99, 104, 101, 110, 103, 122, 105, 46, 99, 111, 109], [104, 111, 109, 101, 119, 101, 98, 46, 99, 110], [108, 105, 108, 108, 121, 97, 100, 109, 105, 110, 46, 99, 110], [122, 106, 111, 108, 46, 99, 111, 109, 46, 99, 110], [104, 107, 115, 111, 102, 116, 46, 99, 110], [119, 120, 106, 121, 46, 99, 111, 109, 46, 99, 110], [106, 115, 101, 99, 111, 110, 111, 109, 121, 46, 99, 111, 109], [104, 111, 115, 115, 107, 121, 46, 99, 111, 109], [103, 117, 105, 115, 101, 110, 46, 99, 111, 109, 46, 99, 110], [119, 120, 116, 111, 111, 46, 99, 111, 109], [98, 97, 99, 107, 118, 46, 99, 111, 109, 46, 99, 110], [119, 117, 100, 97, 111, 109, 101, 100, 105, 97, 46, 99, 111, 109], [99, 116, 118, 105, 116, 46, 116, 118], [99, 122, 116, 118, 99, 108, 111, 117, 100, 46, 99, 111, 109], [108, 101, 109, 107, 111, 111, 46, 99, 111, 109], [99, 100, 121, 115, 120, 121, 46, 99, 110], [116, 101, 110, 99, 101, 110, 116, 45, 99, 108, 111, 117, 100, 46, 99, 111, 109], [104, 111, 103, 101, 46, 99, 110], [115, 99, 104, 111, 111, 108, 45, 108, 105, 118, 101, 46, 99, 110], [105, 113, 105, 108, 117, 46, 99, 111, 109], [109, 97, 107, 101, 109, 97, 103, 105, 99, 46, 99, 99], [101, 110, 118, 105, 115, 105, 111, 110, 45, 116, 101, 99, 104, 46, 99, 110], [98, 101, 46, 106, 122, 121, 113, 46, 108, 116, 100], [112, 101, 111, 112, 108, 101, 97, 112, 112, 46, 99, 111, 109], [49, 55, 119, 111, 46, 99, 110], [104, 111, 114, 116, 105, 45, 101, 120, 112, 111, 50, 48, 49, 57, 46, 99, 111, 109], [101, 113, 118, 114, 97, 114, 46, 99, 111, 109], [97, 110, 97, 45, 115, 101, 114, 118, 105, 99, 101, 46, 99, 110], [110, 98, 115, 46, 99, 110], [116, 118, 53, 118, 114, 46, 99, 99], [121, 105, 115, 112, 97, 99, 101, 46, 99, 110], [99, 99, 116, 118, 52, 103, 46, 99, 111, 109], [118, 116, 99, 51, 54, 53, 46, 99, 111, 109], [118, 114, 45, 116, 46, 99, 111, 109], [106, 108, 110, 116, 118, 46, 99, 110], [53, 103, 110, 108, 105, 118, 101, 46, 110, 101, 116], [53, 103, 110, 108, 105, 118, 101, 46, 99, 111, 109], [53, 103, 110, 108, 105, 118, 101, 46, 99, 110], [50, 119, 101, 110, 46, 99, 110], [119, 97, 115, 101, 101, 46, 99, 111, 109], [57, 54, 49, 56, 57, 46, 99, 111, 109], [110, 120, 108, 116, 49, 48, 48, 49, 48, 46, 99, 111, 109], [102, 111, 114, 116, 117, 110, 101, 45, 110, 101, 116, 46, 99, 110], [99, 117, 110, 111, 118, 115, 46, 99, 111, 109], [104, 101, 108, 108, 111, 110, 105, 104, 97, 111, 46, 99, 110], [104, 97, 111, 121, 117, 98, 97, 110, 46, 99, 111, 109], [106, 105, 103, 117, 97, 110, 116, 111, 110, 103, 46, 99, 111, 109], [105, 102, 97, 110, 98, 111, 46, 99, 111, 109], [97, 111, 109, 121, 103, 111, 100, 46, 99, 111, 109], [103, 120, 121, 115, 112, 119, 101, 98, 46, 99, 111, 109], [55, 50, 48, 115, 103, 46, 99, 111, 109], [122, 104, 111, 110, 103, 103, 117, 111, 119, 97, 110, 103, 115, 104, 105, 46, 99, 111, 109], [116, 121, 114, 101, 97, 100, 46, 99, 111, 109], [109, 111, 117, 110, 116, 45, 116, 97, 105, 46, 99, 111, 109, 46, 99, 110], [103, 109, 99, 99, 46, 110, 101, 116]]
        }, xf: function () {
            this.Oa = this.P = this.target = null
        }, ve: function () {
            this.target = JTUtil.cDom(_[39]), DomUtil.setProperties(this.target, {name: this.name}), DomUtil.setStyles(this.target, {
                position: _[184],
                overflow: _[185],
                width: _[186],
                height: _[186],
                backgroundColor: _[187],
                left: _[188],
                top: _[188],
                zIndex: this.zIndex
            }), DomUtil.inject(this.target, this.ue), this.P = JTUtil.cDom(_[39]), DomUtil.setProperties(this.P, {
                id: _[183],
                tabIndex: -1
            }), DomUtil.setStyles(this.P, {
                position: _[184],
                overflow: _[185],
                height: _[186],
                width: _[186],
                outline: _[71]
            }), DomUtil.inject(this.P, this.target), this.P.style[i.prefix + _[189]] = _[71], this.P.style[i.prefix + _[190]] = _[71], this.P.style[i.prefix + _[191]] = _[71], this.Oa = JTUtil.cDom(_[39]), DomUtil.setProperties(this.Oa, {id: _[192]}), DomUtil.setStyles(this.Oa, {
                position: _[184],
                width: _[186],
                height: _[186],
                pointerEvents: _[71]
            }), DomUtil.inject(this.Oa, this.P)
        }, pe: function () {
            this.F = !1;
            var a = i.plat, b = this.Da, c = /chrome\//i.test(b),
                d = /chrome\/(\d+\.\d)/i.test(b) ? 1 * RegExp.$1 : null,
                e = /AppleWebKit\/(\d+\.\d)/i.test(b) ? 1 * RegExp.$1 : null,
                f = /MQQBrowser\/(\d+\.\d)/i.test(b) ? 1 * RegExp.$1 : null, g = /UCBrowser\//i.test(b),
                h = /SogouMobileBrowser\//i.test(b), j = /MiuiBrowser\//i.test(b), k = /Firefox\//i.test(b),
                l = /Version\/4.0 Mobile/i.test(b), m = /baiduboxapp\//i.test(b), n = /baidubrowser\//i.test(b),
                o = /TBS\/(\d+)/i.test(b) ? 1 * RegExp.$1 : null;
            _[193] == a && (c && 42 > d && (this.F = !0), e && 537 > e && (this.F = !0), j && (this.F = !0), g && (this.F = !0), h && (this.F = !0), k && (this.F = !0), l && (this.F = !0), m && (this.F = !0), n && (this.F = !0), /chrome\/45.0.2454.94/i.test(b) && (this.F = !1), /chrome\/44.0.2403.133/i.test(b) && (this.F = !1), f && f >= 7 && (this.F = !1), o && o >= 36824 && (this.F = !1)), (_[115] == a || _[116] == a || _[117] == a) && (g && (this.F = !0), f && (this.F = !0))
        }, te: function () {
            return JTUtil.support_WebGL() ? !0 : !1
        }, se: function () {
            this.ed = 0 < this.rb.search.indexOf(_[194]) ? !0 : !1
        }, Ef: function () {
            this.se(), this.ed && (this.Ec = JTUtil.cDom(_[39]), DomUtil.setStyles(this.Ec, {
                position: _[184],
                left: _[195],
                top: _[195],
                color: _[196],
                fontSize: _[197],
                zIndex: 9999,
                pointerEvents: _[71]
            }), DomUtil.inject(this.Ec, this.target), this.Fc = JTUtil.cDom(_[39]), DomUtil.setStyles(this.Fc, {
                position: _[38],
                left: _[198],
                top: _[198],
                lineHeight: _[186],
                textShadow: _[199]
            }), DomUtil.inject(this.Fc, this.Ec), this.Qb = JTUtil.cDom(_[200]), DomUtil.inject(this.Qb, this.Fc), DomUtil.setStyles(this.Qb, {
                display: _[201],
                textAlign: _[200]
            }))
        }, Dc: function () {
            if (this.ed) {
                var a = _[202] + this.l([49, 46, 48, 46, 49, 49, 57, 50]) + _[203] + this.width + _[204] + this.height + _[205] + this.Da;
                this.Qb && (this.Qb.innerHTML = a)
            }
        }, Ta: function (a) {
            this.Pa(), this.mb = JTUtil.cDom(_[39]), DomUtil.setStyles(this.mb, {
                position: _[184],
                left: _[195],
                top: _[206],
                color: _[196],
                fontSize: _[207],
                zIndex: 9999,
                opacity: .7,
                pointerEvents: _[71]
            }), DomUtil.inject(this.mb, this.target), this.Cc = JTUtil.cDom(_[39]), DomUtil.setStyles(this.Cc, {
                position: _[38],
                left: _[198],
                top: _[208],
                lineHeight: _[209],
                textShadow: _[199]
            }), DomUtil.inject(this.Cc, this.mb), this.Bc = JTUtil.cDom(_[200]), DomUtil.setStyles(this.Bc, {
                display: _[201],
                textAlign: _[200]
            }), DomUtil.inject(this.Bc, this.Cc), this.Bc.innerHTML = a
        }, Pa: function () {
            this.mb && DomUtil.destroy(this.mb)
        }, Ue: function () {
            var b, a = JTUtil.cDom(_[39]);
            DomUtil.setStyles(a, {
                position: _[184],
                left: _[195],
                top: _[195],
                width: _[210],
                zIndex: 1,
                marginTop: _[211],
                marginLeft: _[212],
                backgroundColor: _[213],
                borderRadius: _[214],
                overflow: _[185]
            }), DomUtil.inject(a, this.target), b = JTUtil.cDom(_[39]), DomUtil.setStyles(b, {
                position: _[38],
                padding: _[215],
                textAlign: _[200],
                color: _[216]
            }), DomUtil.inject(b, a), b.innerHTML = this.l([30452, 25773, 25480, 26435, 35831, 32852, 31995, 65306, 60, 98, 114, 62, 60, 98, 114, 62, 30005, 35805, 65306, 48, 50, 49, 45, 53, 48, 50, 55, 54, 49, 57, 50, 32, 60, 98, 114, 62, 60, 98, 114, 62, 25163, 26426, 58, 49, 51, 52, 56, 50, 51, 53, 55, 49, 52, 55, 32, 60, 98, 114, 62, 60, 98, 114, 62, 81, 81, 65306, 57, 52, 51, 54, 48, 49, 49, 57, 57])
        }, Ha: function (a) {
            return a * Math.PI / 180
        }, Ge: function (a, b) {
            a = -(a - this.width / 2), b = -(b - this.height / 2);
            var c = this.S;
            return a = {
                x: a / (this.width / 2) / c[0],
                y: -b / (this.height / 2) / c[5],
                z: 1,
                i: 0
            }, b = mat4.clone(this.J), b = mat4.transpose(b, b), a = vec4.transformMat4([], [a.x, a.y, a.z, a.i], b), a = {
                x: 1e3 * a[0],
                y: 1e3 * a[1],
                z: 1e3 * a[2],
                i: 1e3 * a[3]
            }, {
                pan: Math.abs((180 * Math.atan2(a.x, a.z) / Math.PI % 360 - 270) % 360),
                tilt: 180 * -Math.atan2(a.y, Math.sqrt(a.x * a.x + a.z * a.z)) / Math.PI
            }
        }, hc: function () {
            return 0 <= this.Da.indexOf(_[217]) ? 1 : window.devicePixelRatio ? window.devicePixelRatio : 1
        }, Ff: function (a, b) {
            this.width = parseInt(a) || window.innerWidth, this.height = parseInt(b) || window.innerHeight, a = this.hc(), this.Ab = this.width * a, this.zb = this.height * a, this.be = _[218]
        }, $b: function (a) {
            var c, b = _[127];
            a.L ? (2 != a.L && _[127] != a.L || (b = _[127]), 4 != a.L && _[129] != a.L || (b = _[129]), 5 != a.L && _[128] != a.L || (b = _[128]), 6 != a.L && _[128] != a.L || (b = _[128])) : (b = a.Y / a.W, b = 1 === b ? _[129] : 4 === b ? _[128] : _[127]), a.is360pano = 6 == a.L || 3 == a.L ? 0 : 1, c = this.Pb(window.location[_[219] + this.l([116, 110, 97]) + _[220]]).join(_[13]), (-1 != c.indexOf(_[221] + _[222]) || -1 != c.indexOf(_[223] + _[224])) && (a.is360pano = 0), a.L = b
        }, vd: function (a) {
            var b = this;
            new l.Z({alpha: a.ga}).ea({alpha: 1}, 800).ha(l.M.na.H).da(function () {
                a.ga = this.alpha
            }).ja(function () {
                l.remove(this), b.Tc(b.bc), b.pg(), b.api_autoPlay(), b.Jb && b.Jb()
            }).start()
        }, Wg: function (a) {
            var b, c, d, e;
            for (b = a.getSupportedExtensions(), c = [_[225], _[226], _[227]], d = 0; d < b.length; d++) for (e = 0; e < c.length; e++) if (0 < b[d].indexOf(c[e])) return b = a.getExtension(b[d]), {
                type: c[e],
                Mg: b,
                Ng: a.getParameter(a.COMPRESSED_TEXTURE_FORMATS)
            }
        }, mg: function () {
            this.ua = JTUtil.cDom(this.l([99, 97, 110, 118, 97, 115])), DomUtil.setStyles(this.ua, {
                position: _[184],
                width: _[186],
                height: _[186],
                left: _[188],
                top: _[188]
            }), DomUtil.inject(this.ua, this.Oa)
        }, og: function () {
            for (var a = null, b = {
                alpha: !1,
                depth: !1,
                stencil: !1,
                antialias: !0,
                premultipliedAlpha: !0,
                preserveDrawingBuffer: this.preserveDrawingBuffer
            }, c = 0; 4 > c && !(a = this.ua.getContext([_[228], _[229], _[230], _[231]][c], b)); c++) ;
            a.frontFace(a.CCW), a.enable(a.CULL_FACE), a.cullFace(a.BACK), a.enable(a.BLEND), a.blendFunc(a.SRC_ALPHA, a.ONE_MINUS_SRC_ALPHA), this.a = a
        }, Xf: function () {
            this.a.clearColor(0, 0, 0, 1)
        }, rg: function () {
            this.a && (this.Xf(), this.ua.width = this.Ab, this.ua.height = this.zb, this.ua.style.width = this.width + _[19], this.ua.style.height = this.height + _[19])
        }, Jd: function (a, b) {
            return a = this.a.createShader(a), this.a.shaderSource(a, b.join(_[232])), this.a.compileShader(a), a
        }, ng: function (a, b) {
            var c = this.a.createProgram();
            return a = this.Jd(this.a.VERTEX_SHADER, a), b = this.Jd(this.a.FRAGMENT_SHADER, b), this.a.attachShader(c, a), this.a.attachShader(c, b), this.a.linkProgram(c), this.a.deleteShader(a), this.a.deleteShader(b), this.a.getProgramParameter(c, this.a.LINK_STATUS) || console.log(_[233]), c
        }, lg: function () {
            this.ac = this.ng(this.Tf, this.De), this.Qd(), this.hg(this.ac)
        }, Qd: function (a) {
            this.a.useProgram(a || this.ac)
        }, hg: function (a) {
            a = a ? a : this.ac, this.v.Gc = this.a.getAttribLocation(a, _[234]), this.v.U = this.a.getAttribLocation(a, _[235]), this.v.Qe = this.a.getUniformLocation(a, _[125]), this.v.Mf = this.a.getUniformLocation(a, _[236]), this.v.Nf = this.a.getUniformLocation(a, _[237]), this.v.Kf = this.a.getUniformLocation(a, _[238]), this.v.Lf = this.a.getUniformLocation(a, _[239]), this.v.$e = this.a.getUniformLocation(a, _[240]), this.v.kf = this.a.getUniformLocation(a, _[241]), this.v.Ce = this.a.getUniformLocation(a, _[242]), this.v.cd = this.a.getUniformLocation(a, _[243]), this.a.enableVertexAttribArray(this.v.Gc), this.a.enableVertexAttribArray(this.v.U), this.G(1, 0, 1, 0)
        }, Nd: function (a) {
            var b = /iphone|ipod|ipad/gi.test(navigator.platform),
                c = /AppleWebKit\/(\d+\.\d)/i.test(this.Da) ? 1 * RegExp.$1 : null, d = !1;
            c && c >= 603 && 604 > c && (d = !0), b && d && a && _[85] == a.Aa && _[106] == a.Va ? this.a.uniform1i(this.v.cd, 1) : this.a.uniform1i(this.v.cd, 0)
        }, fa: function (a, b, c) {
            b = b || this.S, this.a.uniformMatrix4fv(this.v.$e, !1, a || this.J), this.a.uniformMatrix4fv(this.v.kf, !1, b), this.a.uniform1f(this.v.Ce, isNaN(c) ? 1 : c)
        }, G: function (a, b, c, d) {
            this.a.uniform1fv(this.v.Mf, new Float32Array([a])), this.a.uniform1fv(this.v.Kf, new Float32Array([b])), this.a.uniform1fv(this.v.Nf, new Float32Array([c])), this.a.uniform1fv(this.v.Lf, new Float32Array([d]))
        }, Wa: function (a, b) {
            this.a.bindTexture(this.a.TEXTURE_2D, a), this.a.texParameteri(this.a.TEXTURE_2D, this.a.TEXTURE_MAG_FILTER, this.a.LINEAR), this.a.texParameteri(this.a.TEXTURE_2D, this.a.TEXTURE_MIN_FILTER, this.a.LINEAR), this.a.texParameteri(this.a.TEXTURE_2D, this.a.TEXTURE_WRAP_S, this.a.CLAMP_TO_EDGE), this.a.texParameteri(this.a.TEXTURE_2D, this.a.TEXTURE_WRAP_T, this.a.CLAMP_TO_EDGE), this.a.texImage2D(this.a.TEXTURE_2D, 0, this.a.RGBA, this.a.RGBA, this.a.UNSIGNED_BYTE, b), this.a.bindTexture(this.a.TEXTURE_2D, null)
        }, Id: function (a) {
            a && a.la && (this.a.deleteBuffer(a.la), this.a.deleteBuffer(a.Ua), this.a.deleteBuffer(a.ba), this.a.deleteTexture(a.U))
        }, Hd: function () {
            for (var a in this.Ea) this.Id(this.Ea[a]);
            this.Ea = {}, this.cb = {}
        }, Ub: function (a) {
            this.a.bindBuffer(this.a.ARRAY_BUFFER, a.la), this.a.vertexAttribPointer(this.v.Gc, a.la.Gb, this.a.FLOAT, !0, 0, 0), this.a.bindBuffer(this.a.ARRAY_BUFFER, a.Ua), this.a.vertexAttribPointer(this.v.U, a.Ua.Gb, this.a.FLOAT, !0, 0, 0), this.a.bindTexture(this.a.TEXTURE_2D, a.U), this.a.bindBuffer(this.a.ELEMENT_ARRAY_BUFFER, a.ba)
        }, vg: function () {
            this.api_setDBViewIPD(this.Za), this.sg(), this.mg(), this.og(), this.lg(), this.zf(), this.Xe(), this.We(), this.Ve()
        }, tg: function () {
            window.cancelAnimationFrame(this.Ze), this.Md(), this.C && this.api_OpenGyro()
        }, ih: function (a, b) {
            return a = parseFloat(a), b = parseFloat(b), {
                x: 2 * a / 180,
                y: Math.log(Math.tan((90 + b) * Math.PI / 360)) / (Math.PI / 180) / 180
            }
        }, lh: function (a, b) {
            return [180 * (a / 2), 180 / Math.PI * (2 * Math.atan(Math.exp(180 * (b / 1) * Math.PI / 180)) - Math.PI / 2)]
        }, Wf: function () {
            var a, b;
            for (this.aa && this.Te(), this.Fb && this.cf(), this.Ia && this.pa && this.Yd(), this.Qd(), a = 0; a < this.ka.length; a++) b = this.ka[a], this.Nd(b), b.za && b.xe()
        }, cg: function () {
            var a = this.D, b = mat4.create(), c = mat4.create(), d = this.va();
            this.fa(c, b), this.Ub(a), this.G(1, 0, 1, 0, 1), this.a.viewport(d.i - a.Rf, d.j - a.Uf, a.ob, a.nb), this.a.drawElements(this.a.TRIANGLES, a.ba.ca, this.a.UNSIGNED_SHORT, 0)
        }, ag: function () {
            var a = this.Ya, b = mat4.create(), c = mat4.create(), d = this.va();
            this.fa(c, b), this.Ub(a), this.G(1, 0, 1, 0, 1), this.a.viewport(d.i / 2 - a.ob / 2, d.j / 2 - a.nb / 2, a.ob, a.nb), this.a.drawElements(this.a.TRIANGLES, a.ba.ca, this.a.UNSIGNED_SHORT, 0)
        }, Vf: function (a) {
            var b = a.ba.ca, c = this.va(), d = mat4.create(), e = mat4.create();
            this.fa(d, e, a.ga), this.G(1, 0, 1, 0), this.ia ? c.i > c.j ? (a = JTUtil.getBestFitSize(a.Y, a.W, .5 * c.i, c.j), this.a.viewport(a.left, a.top, a.width, a.height), this.a.drawElements(this.a.TRIANGLES, b, this.a.UNSIGNED_SHORT, 0), this.a.viewport(.5 * c.i + a.left, a.top, a.width, a.height)) : (a = JTUtil.getBestFitSize(a.Y, a.W, c.i, .5 * c.j), this.a.viewport(a.left, a.top, a.width, a.height), this.a.drawElements(this.a.TRIANGLES, b, this.a.UNSIGNED_SHORT, 0), this.a.viewport(a.left, a.top + .5 * c.j, a.width, a.height)) : (a = JTUtil.getBestFitSize(a.Y, a.W, c.i, c.j), this.a.viewport(a.left, a.top, a.width, a.height)), this.a.drawElements(this.a.TRIANGLES, b, this.a.UNSIGNED_SHORT, 0)
        }, eg: function (a) {
            _[127] == a.L ? this.Yf(a) : this.Zf(a), this.V && this.$f()
        }, Yf: function (a) {
            var c, b = this.Pb(this.rb[_[244] + this.l([115, 116, 110, 97]) + _[220]]).join(_[13]);
            (-1 != b.indexOf(_[245] + _[246]) || -1 != b.indexOf(_[247] + _[248])) && (a.ga = .6), b = a.ba.ca, c = this.va(), this.fa(a.J, a.S, a.ga), this.G(1, 0, 1, 0), this.ia ? (c.i > c.j ? (this.a.viewport(0, 0, .5 * c.i, c.j), this.Hb && this.fa(this.kc, this.Hb, a.ga), this.a.drawElements(this.a.TRIANGLES, b, this.a.UNSIGNED_SHORT, 0), this.a.viewport(.5 * c.i, 0, .5 * c.i, c.j)) : (this.a.viewport(0, 0, c.i, .5 * c.j), this.Hb && this.fa(this.kc, this.Hb, a.ga), this.a.drawElements(this.a.TRIANGLES, b, this.a.UNSIGNED_SHORT, 0), this.a.viewport(0, .5 * c.j, c.i, .5 * c.j)), this.xd && this.fa(this.kc, this.xd, a.ga)) : this.a.viewport(0, 0, c.i, c.j), this.a.drawElements(this.a.TRIANGLES, b, this.a.UNSIGNED_SHORT, 0)
        }, Zf: function (a) {
            var b = this.va(), c = a.L, d = a.ba.ca;
            this.fa(a.J, a.S, a.ga), this.ia ? b.i > b.j ? (_[128] == c && this.G(.5, 0, 1, 0), _[129] == c && this.G(1, 0, .5, 0), this.a.viewport(0, 0, .5 * b.i, b.j), this.a.drawElements(this.a.TRIANGLES, d, this.a.UNSIGNED_SHORT, 0), _[128] == c && this.G(.5, .5, 1, 0), _[129] == c && this.G(1, 0, .5, .5), this.a.viewport(.5 * b.i, 0, .5 * b.i, b.j)) : (_[128] == c && this.G(.5, 0, 1, 0), _[129] == c && this.G(1, 0, .5, 0), this.a.viewport(0, 0, b.i, .5 * b.j), this.a.drawElements(this.a.TRIANGLES, d, this.a.UNSIGNED_SHORT, 0), _[128] == c && this.G(.5, .5, 1, 0), _[129] == c && this.G(1, 0, .5, .5), this.a.viewport(0, .5 * b.j, b.i, .5 * b.j)) : (_[128] == c && this.G(.5, 0, 1, 0), _[129] == c && this.G(1, 0, .5, 0), this.a.viewport(0, 0, b.i, b.j)), this.a.drawElements(this.a.TRIANGLES, d, this.a.UNSIGNED_SHORT, 0)
        }, dg: function (a) {
            var b = this.va();
            this.fa(a.J, a.S, a.ga), this.G(1, 0, 1, 0), this.ia ? b.i > b.j ? (this.a.viewport(0, 0, .5 * b.i, b.j), this.a.drawArrays(this.a.TRIANGLES, 0, a.la.ca), this.a.viewport(.5 * b.i, 0, .5 * b.i, b.j)) : (this.a.viewport(0, 0, b.i, .5 * b.j), this.a.drawArrays(this.a.TRIANGLES, 0, a.la.ca), this.a.viewport(0, .5 * b.j, b.i, .5 * b.j)) : this.a.viewport(0, 0, b.i, b.j), this.a.drawArrays(this.a.TRIANGLES, 0, a.la.ca)
        }, $f: function () {
            var a, b;
            if (!JTUtil.isEmptyObject(this.Ea)) {
                a = this.va(), this.fa(), this.G(1, 0, 1, 0);
                for (b in this.Ea) this.bg(this.Ea[b], a, b)
            }
        }, bg: function (a, b) {
            var c = a.ba.ca;
            this.Ub(a), this.ia ? b.i > b.j ? (this.a.viewport(0, 0, .5 * b.i, b.j), this.a.drawElements(this.a.TRIANGLES, c, this.a.UNSIGNED_SHORT, 0), this.a.viewport(.5 * b.i, 0, .5 * b.i, b.j)) : (this.a.viewport(0, 0, b.i, .5 * b.j), this.a.drawElements(this.a.TRIANGLES, c, this.a.UNSIGNED_SHORT, 0), this.a.viewport(0, .5 * b.j, b.i, .5 * b.j)) : this.a.viewport(0, 0, b.i, b.j), this.a.drawElements(this.a.TRIANGLES, c, this.a.UNSIGNED_SHORT, 0)
        }, Kd: function (a) {
            return _[62] == a.T ? this.ig() : _[126] == a.T ? this.gg() : _[65] == a.T ? {
                ta: [-1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0],
                sa: [0, 1, 1, 1, 0, 0, 1, 0],
                oa: [0, 1, 2, 1, 3, 2]
            } : void 0
        }, ig: function () {
            var a, b, c, d, e, f, g, h, i, j, k, l, m;
            for (a = [], b = [], c = [], d = [], e = 0; 36 >= e; e++) for (f = e * Math.PI / 36, g = Math.sin(f), f = Math.cos(f), h = 0; 72 >= h; h++) i = 2 * h * Math.PI / 72, j = Math.cos(i) * g, k = f, i = Math.sin(i) * g, l = h / 72, m = e / 36, b.push(j), b.push(k), b.push(i), c.push(l), c.push(m), a.push(j), a.push(k), a.push(i), 36 != e && 72 != h && (j = 73 * e + h, k = j + 73, d.push(j), d.push(k), d.push(j + 1), d.push(k), d.push(k + 1), d.push(j + 1));
            return {gf: b, sa: c, ta: a, oa: d}
        }, jh: function () {
            return {ta: [-1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0], sa: [0, 1, 1, 1, 0, 0, 1, 0], oa: [0, 1, 2, 1, 3, 2]}
        }, gg: function () {
            var a = Math.sqrt(Math.pow(5, 2) + Math.pow(5, 2)) / 2;
            return a = 5 * a / (Math.sqrt(Math.pow(5, 2) + Math.pow(a, 2)) + a), {
                ta: [0, 0, a - 5, -5, 0, a, 0, -5, a, 0, 0, a - 5, 0, -5, a, 5, 0, a, 0, 0, a - 5, 5, 0, a, 0, 5, a, 0, 0, a - 5, 0, 5, a, -5, 0, a, -5, 0, a, 0, 5, a, 0, -5, a, 0, -5, a, 0, 5, a, 5, 0, a],
                sa: [1, 1, 1, .5, .5, 1, 0, 1, .5, 1, 0, .5, 0, 0, 0, .5, .5, 0, 1, 0, .5, 0, 1, .5, 1, .5, .5, 0, .5, 1, .5, 1, .5, 0, 0, .5],
                oa: [0, 1, 2]
            }
        }, fg: function (a, b, c, d, e, f) {
            var n, o, p, q, r, s, g = [], h = [], i = [], j = a + e / 2, k = b + f / 2, l = (a + e - a) / 24,
                m = (b + f - b) / 24;
            for (f = [], n = 0; 24 >= n; n++) for (e = (a + l * n) * Math.PI / c, o = Math.sin(e), p = Math.cos(e), q = 0; 24 >= q; q++) e = 2 * (b + m * q) * Math.PI / d, r = Math.sin(e), s = Math.cos(e), s *= o, e = p, r *= o, g.push(s), g.push(e), g.push(r), 0 == n && 0 == q && (f.push(s), f.push(e), f.push(r)), 0 == n && 12 == q && (f.push(s), f.push(e), f.push(r)), 0 == n && 24 == q && (f.push(s), f.push(e), f.push(r)), 12 == n && 0 == q && (f.push(s), f.push(e), f.push(r)), 12 == n && 12 == q && (f.push(s), f.push(e), f.push(r)), 12 == n && 24 == q && (f.push(s), f.push(e), f.push(r)), 24 == n && 0 == q && (f.push(s), f.push(e), f.push(r)), 24 == n && 12 == q && (f.push(s), f.push(e), f.push(r)), 24 == n && 24 == q && (f.push(s), f.push(e), f.push(r));
            for (e = 0; 24 >= e; e++) for (s = 0; 24 >= s; s++) a = s / 24, b = e / 24, h.push(a), h.push(b);
            for (e = 0; 24 > e; e++) for (s = 0; 24 > s; s++) a = 25 * e + s, b = a + 25, i.push(a), i.push(b), i.push(a + 1), i.push(b), i.push(b + 1), i.push(a + 1), a = s / 24, b = e / 24, h.push(a), h.push(b);
            return a = [], e = j * Math.PI / c, o = Math.sin(e), p = Math.cos(e), e = 2 * k * Math.PI / d, r = Math.sin(e), s = Math.cos(e), e = p, r *= o, a.push(s * o), a.push(e), a.push(r), {
                sa: h,
                ta: g,
                oa: i,
                Rc: a,
                qe: f
            }
        }, kh: function (a, b, c, d) {
            var k, l, m, n, o, p, q, e = [], f = [], g = [], h = [], i = 1 * (1e4 * a).toFixed(0),
                j = 1 * (1e4 * b).toFixed(0);
            for (a += c / 2, b += d / 2, c = (i + 1 * (1e4 * c).toFixed(0) - i) / 48, k = (j + 1 * (1e4 * d).toFixed(0) - j) / 48, l = 0; 48 >= l; l++) for (d = (i + c * l) / 1e4 * Math.PI / 180, m = Math.sin(d), n = Math.cos(d), o = 0; 48 >= o; o++) d = 2 * ((j + k * o) / 1e4) * Math.PI / 360, p = Math.sin(d), q = Math.cos(d), q *= m, d = n, p *= m, f.push(q), f.push(d), f.push(p), e.push(q), e.push(d), e.push(p);
            for (d = 0; 48 >= d; d++) for (q = 0; 48 >= q; q++) i = q / 48, j = d / 48, g.push(i), g.push(j);
            for (d = 0; 48 > d; d++) for (q = 0; 48 > q; q++) i = 49 * d + q, j = i + 49, h.push(i), h.push(j), h.push(i + 1), h.push(j), h.push(j + 1), h.push(i + 1), i = q / 48, j = d / 48, g.push(i), g.push(j);
            return i = [], d = a * Math.PI / 180, m = Math.sin(d), n = Math.cos(d), d = 2 * b * Math.PI / 360, p = Math.sin(d), q = Math.cos(d), d = n, p *= m, i.push(q * m), i.push(d), i.push(p), {
                gf: f,
                sa: g,
                ta: e,
                oa: h,
                Rc: i
            }
        }, sg: function () {
            this.ua = this.a = null, this.Tf = [_[249], _[250], _[251], _[252], _[253], _[254], _[255], _[256], _[257]], this.$d = _[258], this.ae = _[259], this.De = [_[260], _[261], _[262], _[263], _[264], _[265], _[265], _[266], _[267], _[268], _[269], _[270], _[271], _[272], _[273], _[274], _[275], _[276], _[277], _[278], _[279], _[280], _[281], _[282], _[283], _[284], _[285], _[286], _[283], _[287], _[285], _[288], _[289], _[290], _[291], _[292], _[257]], this.v = {}, this.Ea = {}, this.g = null, this.Ja = !1, this.ka = []
        }, ic: function (a) {
            for (var b = null, c = this.ka.length, d = 0; c > d; d++) if (this.ka[d].X === a) {
                b = this.ka[d];
                break
            }
            return b
        }, Tc: function (a) {
            for (var b = null, c = 0, d = 0; d < this.ka.length; d++) if (this.ka[d].X == a) {
                c = d, b = this.ka[d];
                break
            }
            b && (this.Id(b), this.ka.splice(c, 1))
        }, Vb: function (a, b) {
            return b = b || {}, b.U = this.a.createTexture(), b.Ua = this.a.createBuffer(), b.la = this.a.createBuffer(), b.ba = this.a.createBuffer(), this.Pd(a, b), b
        }, Pd: function (a, b) {
            this.a.bindBuffer(this.a.ARRAY_BUFFER, b.Ua), this.a.bufferData(this.a.ARRAY_BUFFER, new Float32Array(a.sa), this.a.STATIC_DRAW), b.Ua.Gb = 2, b.Ua.ca = .5 * a.sa.length, this.a.bindBuffer(this.a.ARRAY_BUFFER, b.la), this.a.bufferData(this.a.ARRAY_BUFFER, new Float32Array(a.ta), this.a.STATIC_DRAW), b.la.Gb = 3, b.la.ca = a.ta.length / 3, this.a.bindBuffer(this.a.ELEMENT_ARRAY_BUFFER, b.ba), this.a.bufferData(this.a.ELEMENT_ARRAY_BUFFER, new Uint16Array(a.oa), this.a.STATIC_DRAW), b.ba.Gb = 1, b.ba.ca = a.oa.length
        }, va: function () {
            var a = this.Ab, b = this.zb, c = a / b;
            return this.ia && (c = a > b ? .5 * a / b : a / (.5 * b)), {Rd: c, i: a, j: b}
        }, La: function (a) {
            var b = this.u, c = this.Je(), d = this.s, e = this.K, f = this.va().Rd;
            this.S = mat4.create(), mat4.perspective(this.S, this.Ha(c), f, .001, 1e3), mat4.translate(this.S, this.S, [0, 0, e]), a ? (a.rotateX(this.Ha(b)), b = [a.x, a.y, a.z, a.w], quat.invert(b, b), b = mat4.fromQuat([], b), mat4.rotateX(b, b, this.Ha(90)), mat4.rotateY(b, b, this.Ha(90)), mat4.rotateY(b, b, this.Ha(d)), this.J = b, this.Zc = this.He(b)) : (a = 90, _[126] == this.T && (a = 0), this.J = mat4.create(), mat4.rotateX(this.J, this.J, this.Ha(-b)), mat4.rotateY(this.J, this.J, this.Ha(d + a)), this.Zc = 0), this.V && this.we(), this.Dd && this.Dd()
        }, Xe: function () {
            this.wa = JTUtil.cDom(this.l([99, 97, 110, 118, 97, 115])), this.wa.setAttribute(_[67], _[68]), this.ke = this.wa.getContext(_[69]), this.ce = _[293], this.de = _[294], this.ee = _[295], this.fe = _[296]
        }, sc: function () {
            var a = JTUtil.cDom(_[297]);
            return a.setAttribute(_[298], !0), a.setAttribute(_[299], _[300]), a.setAttribute(_[301], _[302]), a.setAttribute(_[303], !0), a.setAttribute(_[67], _[68]), a.setAttribute(_[304], _[305]), a
        }, Ib: function (a, b, c, d) {
            var e = !0;
            !1 === d && (e = !1), d = new Image, e && (d.crossOrigin = _[68]), d.onload = function () {
                b && b(this)
            }, d.onerror = function () {
                c && c(this)
            }
            //TODO utovr的logo应用位置，数据存放在_[]数组下，图片第一行在下标_[258]位置
            // d.src = a;
        }, rc: function (a, b, c, d, e, f, g) {
            a.tf = c || 0, a.Vc = f, a.Wc = g, a.Ra = e;
            for (var h in d) this.Sb[h] = EventUtil.addEvent(a, h, d[h].bind(this));
            return this.Ye(a, b), a.load(), this.Pa(), a
        }, Ye: function (a, b) {
            var e, c = JTUtil.getFileExt(b).substring(0, 5), d = b.indexOf(_[306]);
            this.hd = !1, _[114] == c || _[307] == c ? (e = this, JTUtil.loadResource(b, function (c) {
                if (e.jb = 0 >= c.indexOf(_[308]) ? !0 : !1, e.jb && !e.f) e.api_playerError(4); else if (-1 < c.indexOf("_[309]")) e.hd = !0, e.api_playerError(1); else if (i.isMobile) {
                    c = i.plat;
                    var d = navigator.userAgent, f = /chrome\//i.test(d),
                        g = /chrome\/(\d+\.\d)/i.test(d) ? 1 * RegExp.$1 : null;
                    /TBS\/(\d+)/i.test(d), _[193] == c && f && g >= 70 && window.Hls && window.Hls.isSupported() ? (c = a, e.O && (e.O.destroy(), e.O = null), e.O = new window.Hls({af: 15}), e.O.attachMedia(c), e.O.loadSource(b)) : a.src = b
                } else window.Hls && window.Hls.isSupported() ? _[310] == i.plat && _[311] == i.type ? a.src = b : (c = a, e.O && (e.O.destroy(), e.O = null), e.O = new window.Hls({af: 15}), e.O.attachMedia(c), e.O.loadSource(b)) : e.api_playerError(6)
            })) : 0 === d ? (this.jb = !0, this.f ? (a.src = b, window.enableInlineVideo && window.enableInlineVideo(this.g, !this.g.hasAttribute(_[312]), !0)) : this.api_playerError(4)) : (a.src = b, window.enableInlineVideo && window.enableInlineVideo(this.g, !this.g.hasAttribute(_[312]), !0))
        }, ne: function (a, b, c, d) {
            this.Ta(this.l([20999, 25442, 20013, 46, 46, 46, 46, 46, 46])), this.rc(this.g, a, b, {}, !0, c, d)
        }, me: function (a) {
            var b = this;
            this.Ta(this.l([20999, 25442, 20013, 46, 46, 46, 46, 46, 46])), this.Ib(a, function (a) {
                b.Pa(), this.Y = a.width, this.W = a.height;
                var c = b.ic(b.X);
                b.$b(this.Y, this.W, _[73], c), b.a.bindTexture(b.a.TEXTURE_2D, c.U), b.a.texImage2D(b.a.TEXTURE_2D, 0, b.a.RGBA, b.a.RGBA, b.a.UNSIGNED_BYTE, a), b.a.bindTexture(b.a.TEXTURE_2D, null), b.Jb && b.Jb()
            }, function () {
                b.Ta(decodeURI(_[313]))
            })
        }, We: function () {
            this.ge = _[314];
            var a = this.l([100, 97, 116, 97, 58, 105, 109, 97, 103, 101, 47, 112, 110, 103, 59, 98, 97, 115, 101, 54, 52, 44]),
                b = [this.$d, _[13], _[13], _[315], _[316], this.ae, _[13], _[317], _[318], _[319], _[320], this.be, _[321], this.ee, this.fe, _[13], _[322], _[323], _[324], this.ce, _[325], _[326], this.de, _[327], _[328], this.ge],
                c = this.hc(), d = 15 / c, e = _[13], f = c;
            e = {
                ta: [-1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0],
                sa: [0, 1, 1, 1, 0, 0, 1, 0],
                oa: [0, 1, 2, 1, 3, 2]
            }, !this.D && (this.D = this.Vb(e)), 1 === this.Xa ? (this.Na = this.Td, f = 1.2, e = a + this.Na) : (f = 2, this.Na = b.join(_[329]), e = a + this.Na), this.Ib(e, function (a) {
                var b = a.width, e = a.height, g = b / f, h = e / f;
                this.D.Sf = d, this.D.ob = g * c, this.D.nb = h * c, this.D.Rf = g * c + d, this.D.Uf = h * c + d, this.D.pf = b, this.D.nf = e, this.D.za = !0, this.Wa(this.D.U, a)
            }.bind(this), null, !1)
        }, Ve: function () {
            var b, c, a = document.createElement(this.l([99, 97, 110, 118, 97, 115]));
            a.width = 270, a.height = 60, b = a.getContext(_[69]), b.clearRect(0, 0, a.width, a.height), this.wf(b, {
                font: _[330],
                textAlign: _[200],
                textBaseline: _[331],
                fillStyle: _[213]
            }), c = this.jc(), b.fillText(c, 135, 20), c = this.l([169]) + unescape(_[332]), b.fillText(c, 135, 40), this.Ya = this.Vb({
                ta: [-1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0],
                sa: [0, 1, 1, 1, 0, 0, 1, 0],
                oa: [0, 1, 2, 1, 3, 2]
            }), this.Ya.ob = 270, this.Ya.nb = 60, this.Ya.za = !0, this.Wa(this.Ya.U, a)
        }, qg: function (a) {
            var b = this;
            this.Ib(a.Mb, function (c) {
                a.Y = c.width || a.Y, a.W = c.height || a.W, b.$b(a), b.kg(c, a), b.Pa(), b.xc(a)
            }, function () {
                b.Ta(decodeURI(_[313]))
            })
        }, kg: function (a, b) {
            this.Wa(b.U, a), this.vd(b), b.za = !0
        }, pg: function () {
            var a, b, c, d, e, f, g, h, i, j;
            if (this.V) {
                for (a = this.V.sceneWidth, b = this.V.sceneHeight, c = this.V.fileBlockWidth, d = this.V.fileBlockHeight, e = Math.ceil(a / c), f = Math.ceil(b / d), g = b % d, h = a % c, i = 0; f > i; i++) for (j = 0; e > j; j++) this.cb[i + _[131] + j] = this.fg(i * d, j * c, b, a, 0 !== g && i == f - 1 ? g : d, 0 !== h && j == e - 1 ? h : c);
                this.Od()
            }
        }, Ld: function (a) {
            var b, d, e, f, g, j, k;
            this.g = this.sc(), this.Xc = !1, this.Ra = i.isMobile ? !1 : this.Ra, this.Sb = {}, b = {}, d = !0, e = !0, f = 0, g = this.g, b.loadstart = function () {
                e = d = !0, f = 0, this.Ta(decodeURI(c[h])), this.Ic && this.Ic()
            }, b.loadeddata = function () {
                a.Y = g.videoWidth || 1920, a.W = g.videoHeight || 960, this.wa.width = a.Y, this.wa.height = a.W, this.$b(a), this.Hc && this.Hc(), this.xc(a), g.Ra && this.api_setVideoPlay()
            }, b.progress = function () {
                this.pb && this.pb()
            }, b.timeupdate = function () {
                e && 0 != this.g.seekable.length && 0 !== this.g.seekable.end(0) && (f = 1 * this.g.tf, this.jb || 0 == f || this.api_setVideoCurTime(f), e = !1), this.qb && this.qb()
            }, b.play = function () {
                this.Jc && this.Jc()
            }, b.canplaythrough = function () {
                if (a.za = !0, this.Pa(), d) {
                    this.Wa(a.U, this.wa);
                    var b = this.g.Vc, c = this.g.Wc;
                    isNaN(b) && isNaN(c) || this.api_walkThrough(.5, b, c, null, null), this.g.Vc = _[43], this.g.Wc = _[43], this.Rb && this.Rb(), this.Wb(a), this.vd(a)
                } else this.Rb && this.Rb(), this.Wb(a);
                d = !1
            }, b.error = function () {
                this.Cb && this.Cb(1)
            }, b.ended = function () {
                a.Se ? this.api_setVideoPlay() : this.Gd && this.Gd()
            }, j = /TBS\/(\d+)/i.test(this.Da) ? 1 * RegExp.$1 : null, k = /MQQBrowser\/(\d+\.\d)/i.test(this.Da) ? 1 * RegExp.$1 : null, j >= 36900 || k >= 7.2 ? (b.x5videoexitfullscreen = function () {
                this.api_setVideoPause(), this.Nc && this.Nc()
            }, b.x5videoenterfullscreen = function () {
                this.Mc && this.Mc()
            }) : b.x5videoenterfullscreen = function () {
                this.api_setVideoPause()
            }, this.F ? this.api_playerError(3) : (this.rc(this.g, a.Mb, 0, b, !1), this.Ra && this.api_setVideoPlay())
        }, jg: function () {
            var a, b;
            return this.ia ? this.width > this.height ? (a = .5 * this.width, b = this.height) : (a = this.width, b = .5 * this.height) : (a = .5 * this.width, b = .5 * this.height), {
                width: a,
                height: b
            }
        }, Od: function () {
            var a, b, c, d, e;
            if (!JTUtil.isEmptyObject(this.cb)) {
                a = [], b = this.jg(), b = {x: b.width, y: b.height};
                for (c in this.cb) d = this.cb[c], e = this.api_3DXYZArrToScreen(d, c), e.isInner && (a.push({
                    yd: this.X,
                    key: c,
                    le: d,
                    position: this.wd(e, b)
                }), delete this.cb[c]);
                0 !== a.length && (a.sort(function (a, b) {
                    return a.position > b.position ? 1 : -1
                }), this.gd(a, 0))
            }
        }, gd: function (a, b) {
            var d, e, f, g, c = a[b];
            c && c.yd == this.X && (d = c.key.split(_[131]), e = d[0], f = d[1], _[333] == this.V.fileBlockType ? (d = this.V.fileBlockWidth, g = this.V.fileBlockHeight, d = this.V.fileBlockDir + (d + _[334] + g + _[335] + f * d + _[335] + e * g)) : d = this.V.fileBlockDir + (e + _[131] + f + _[336]), this.Ib(d, function (d) {
                c.yd == this.X && (this.ug(d, e, f, c.le), b += 1, this.gd(a, b))
            }.bind(this)))
        }, ug: function (a, b, c, d) {
            d = this.Vb(d), this.Wa(d.U, a), this.Ea[b + _[131] + c] = d
        }, Wb: function (a) {
            var b, c;
            if (a && !this.Xc) {
                b = this.a, _[118] == a.Va ? (this.ke.drawImage(this.g, 0, 0, this.wa.width, this.wa.height), c = this.wa) : c = this.g;
                try {
                    b.bindTexture(b.TEXTURE_2D, a.U), b.texImage2D(b.TEXTURE_2D, 0, b.RGBA, b.RGBA, b.UNSIGNED_BYTE, c), b.bindTexture(b.TEXTURE_2D, null)
                } catch (d) {
                    this.api_playerError(2)
                }
            }
        }, Md: function () {
            this.a.clear(this.a.COLOR_BUFFER_BIT | this.a.DEPTH_BUFFER_BIT);
            var a = this.ic(this.X);
            l.update(), this.Wf(), this.c && this.D.za && this.cg(), this.kb && this.D.za && this.ag(), a && a.za && this.Uc && this.Uc(), this.Ze = requestAnimationFrame(this.Md.bind(this))
        }, Kg: function () {
            var a = this.D.pf, b = this.D.nf;
            160 === a && 48 === b || 170 === a && 78 === b || this.api_playerError(5)
        }, Jg: function () {
            if (this.Na) {
                var a = this.Na.charAt(51), b = this.Na.charAt(88);
                _[337] === a && _[338] === b || _[339] === a && _[340] === b || this.api_playerError(5)
            } else this.api_playerError(5)
        }, Vd: function (a) {
            var d, e, f, b = this.hc(), c = EventUtil.getOffsetX(a);
            a = EventUtil.getOffsetY(a), d = this.D.Sf / b, e = this.D.ob / b, b = this.D.nb / b, f = this.width, a > d && b + d > a && c > f - e - d && f - d > c && window.open(this.l(1 === this.Xa ? [104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 106, 105, 101, 116, 117, 115, 111, 102, 116, 46, 99, 111, 109] : [104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 106, 105, 101, 116, 117, 115, 111, 102, 116, 46, 99, 111, 109, 47, 116, 114, 97, 99, 107, 47, 114, 101, 100, 105, 114, 101, 99, 116, 46, 97, 115, 112, 120, 63, 102, 114, 111, 109, 61, 115, 100, 107, 45, 99, 111, 112, 121, 114, 105, 103, 104, 116, 38, 116, 111, 61, 104, 116, 116, 112, 37, 51, 65, 37, 50, 70, 37, 50, 70, 119, 119, 119, 46, 117, 116, 111, 118, 114, 46, 99, 111, 109, 37, 50, 70, 100, 101, 118, 101, 108, 111, 112, 101, 114, 99, 101, 110, 116, 101, 114, 37, 50, 70]))
        }, He: function (a) {
            return 180 * (.01 <= Math.sqrt(1 - a[6] * a[6]) ? Math.atan2(-a[4], a[5]) : Math.atan2(a[1], a[0])) / Math.PI
        }, Rg: function (a) {
            return 180 * (Math.asin(a[6]) / Math.PI)
        }, Sg: function (a) {
            return 90 - 180 * (.01 <= Math.sqrt(1 - a[6] * a[6]) ? Math.atan2(-a[2], a[10]) : 0) / Math.PI
        }, wf: function (a, b) {
            for (var c in b) a[c] = b[c]
        }, Yc: function () {
            return this.Qa = (_[341] == this.hb ? this.width : _[342] == this.hb ? this.height : this.width > this.height ? this.width : this.height) / (2 * Math.tan(.5 * (Math.PI / 180) * this.m))
        }, Je: function () {
            var a = 0;
            return a = _[342] == this.hb ? this.m : _[341] == this.hb ? 2 * (180 * Math.atan(.5 * this.height / this.Qa) / Math.PI) : this.width > this.height ? 2 * (180 * Math.atan(.5 * this.height / this.Qa) / Math.PI) : this.m
        }, Qg: function () {
            return this.m
        }, Xg: function () {
            return this.u
        }, Ug: function () {
            return this.s
        }, Vg: function () {
            return this.$
        }, Og: function () {
            return this.K
        }, Pg: function () {
            return {x: this.he || 0, y: this.ie || 0, z: this.je || 0}
        }, Hg: function (a, b, c) {
            this.he = a || 0, this.ie = b || 0, this.je = c || 0, this.La()
        }, Ba: function (a) {
            this.K = a
        }, gb: function (a) {
            var b = this.tc, c = this.uc;
            a = (isNaN(a) ? this.u : a) % 360, a > b && (a = b), c > a && (a = c), this.u = a
        }, fb: function (a) {
            var b = this.ld, c = this.jd;
            this.m = isNaN(a) ? this.m : a, this.m < b && (this.m = b), this.m > c && (this.m = c), this.Yc()
        }, ub: function (a) {
            this.s = isNaN(a) ? this.s : a, this.s = this.s % 360, 0 > this.s && (this.s += 360)
        }, vb: function () {
            this.ub(), this.gb(), this.fb()
        }, Ca: function (a, b, c) {
            this.ub(a), this.gb(b), this.fb(c), this.vb(), this.eb()
        }, lb: function (a, b) {
            this.gb(b), this.ub(a), this.eb()
        }, Sa: function (a) {
            this.fb(a), this.vb(), this.eb()
        }, yc: function (a) {
            this.ub(a), this.eb()
        }, Ob: function (a) {
            this.gb(a), this.eb()
        }, eb: function () {
            !this.C && this.La()
        }, oe: function (a, b) {
            this.La(a, b)
        }, jf: function () {
            this.Dc(), this.vb(), this.rg(), this.La()
        }, Wd: function (a) {
            _[343] == this.fc ? EventUtil.addEvent(a, _[344], this.od, this) : EventUtil.addEvent(a, _[345], this.Lb, this), EventUtil.addEvent(a, _[346], this.Lb, this), EventUtil.addEvent(document, _[347], function () {
                this.Db && this.Db()
            }, this), _[348] == i.pc && (EventUtil.addEvent(a, _[349], this.sd, this), EventUtil.addEvent(document, _[349], this.td, this), EventUtil.addEvent(document, _[350], this.ud, this), EventUtil.addEvent(document, _[349], function (a) {
                a.altKey && a.shiftKey && a.ctrlKey && 86 == a.keyCode && (this.kb = !this.kb)
            }, this), EventUtil.addEvent(this.target, _[351], function (a) {
                EventUtil.stopDefault(a), this.pa = !1, this.b && this.Fd(a, this.jc())
            }, this), EventUtil.addEvent(document, _[352], this.Eb, this), this.oc && EventUtil.addEvent(a, _[353], this.qd, this), this.dd && EventUtil.addEvent(a, _[354], this.api_fullScreen, this), this.rd = EventUtil.addEvent(a, _[355], this.Yb, this)), this.we = EventUtil.throttle(this.Od, 100, !1, !1).bind(this)
        }, lf: function (a) {
            _[343] == this.fc ? EventUtil.removeEvent(a, _[344], this.od) : EventUtil.removeEvent(a, _[345], this.Lb), EventUtil.removeEvent(a, _[346], this.Lb), EventUtil.removeEvent(document, _[347], function () {
                this.Db && this.Db()
            }), _[348] == i.pc && (EventUtil.removeEvent(a, _[349], this.sd), EventUtil.removeEvent(document, _[349], this.td), EventUtil.removeEvent(document, _[350], this.ud), EventUtil.removeEvent(document, _[349], function (a) {
                a.altKey && a.shiftKey && a.ctrlKey && 86 == a.keyCode && (this.kb = !this.kb)
            }), EventUtil.removeEvent(this.target, _[351], function (a) {
                EventUtil.stopDefault(a), this.pa = !1, this.b && this.Fd(a, this.jc())
            }), EventUtil.removeEvent(document, _[352], this.Eb), this.oc && EventUtil.removeEvent(a, _[353], this.qd), this.dd && EventUtil.removeEvent(a, _[354], this.api_fullScreen), EventUtil.removeEvent(a, _[355], this.Yb))
        }, ud: function () {
            this.I()
        }, sd: function (a) {
            32 == a.keyCode && (EventUtil.stopDefault(a), this.api_setVideoToggle())
        }, td: function (a) {
            var b = a.keyCode;
            if (this.aa != b) switch (b) {
                case 37:
                    this.api_left();
                    break;
                case 38:
                    EventUtil.stopDefault(a), this.api_up();
                    break;
                case 39:
                    this.api_right();
                    break;
                case 40:
                    EventUtil.stopDefault(a), this.api_down()
            }
        }, od: function (a) {
            this.ad(a), this.Pc()
        }, Lb: function (a) {
            2 != EventUtil.getButton(a) && (this.ad(a), this.Pc())
        }, Yb: function (a) {
            this.Bd && this.Bd(a)
        }, nd: function (a, b) {
            this.nc && this.pa && (EventUtil.stopDefault(b), a = EventUtil.getEventSize(a), this.wb = a.x, this.xb = a.y, this.Le())
        }, Of: function (a, b) {
            var c = b.targetTouches.length;
            1 == c ? (this.Ka = 0, this.nd(a, b)) : 2 == c && this.oc && (EventUtil.stopDefault(b), this.pa = !1, a = b.targetTouches, a = this.wd({
                x: a[0].clientX,
                y: a[0].clientY
            }, {
                x: a[1].clientX,
                y: a[1].clientY
            }), 0 == this.Ka && (this.Ka = a), b = this.Ka / a, this.Ka = a, this.Fe(b))
        }, pd: function (a) {
            2 != EventUtil.getButton(a) && (this.Me(a), this.vc()), this.Ka = 0
        }, bf: function () {
            this.pa = !1, this.vc()
        }, Pc: function () {
            var a = this.P;
            this.Qf = EventUtil.addEvent(a, _[356], this.Of, this), this.Pf = EventUtil.addEvent(a, _[357], this.pd, this), this.df = EventUtil.addEvent(a, _[355], this.nd, this), _[153] == this.fc && (this.ff = EventUtil.addEvent(a, _[358], this.pd, this)), this.ef = EventUtil.addEvent(a, _[359], this.bf, this), EventUtil.removeEvent(a, _[355], this.rd)
        }, vc: function () {
            var a = this.P;
            EventUtil.removeEvent(a, _[356], this.Qf), EventUtil.removeEvent(a, _[357], this.Pf), EventUtil.removeEvent(a, _[355], this.df), EventUtil.removeEvent(a, _[358], this.ff), EventUtil.removeEvent(a, _[359], this.ef), this.rd = EventUtil.addEvent(a, _[355], this.Yb, this)
        }, qd: function (a) {
            EventUtil.stopPropagation(a), EventUtil.stopDefault(a), this.Ga += .375 * (0 < (a.wheelDelta || -a.detail) ? 3 : -3), this.Fb = !0
        }, Fe: function (a) {
            this.Sa(this.m * a)
        }, wd: function (a, b) {
            var c = a.x - b.x;
            return a = a.y - b.y, Math.sqrt(c * c + a * a)
        }, Tg: function (a, b) {
            if (45 > this.$ && -45 < this.$) {
                var c = a;
                a = b
            } else 45 < this.$ && 135 > this.$ ? (c = b, a = -a) : 135 < Math.abs(this.$) ? (c = -a, a = -b) : -45 > this.$ && -135 < this.$ ? c = -b : (c = a, a = b);
            return {Zg: c, $g: a}
        }, ad: function (a) {
            this.I(), this.Ia && l.remove(this.ye);
            var b = EventUtil.getEventSize(a);
            this.pa = !0, this.zc = this.wb = b.x, this.Ac = this.xb = b.y, this.Hf = (new Date).getTime(), this.Ad && this.Ad(a)
        }, Le: function () {
            var a = this.Bb ? -1 : 1, b = 180 * a * Math.atan((this.wb - this.zc) / this.Qa) / Math.PI;
            a = 180 * a * Math.atan((this.xb - this.Ac) / this.Qa) / Math.PI, this.Ia ? (this.dc = b, this.ec = a) : (this.lb(this.s + b, this.u - a), this.zc = this.wb, this.Ac = this.xb)
        }, Me: function (a) {
            this.pa && (this.Cd && this.Cd(a), this.If = (new Date).getTime(), 150 > this.If - this.Hf ? this.Ke(a) : 1 == this.Ia && this.Zd(this.dc, this.ec), this.pa = !1, this.ec = this.dc = this.Ka = 0)
        }, Ke: function (a) {
            this.c && this.Vd(a), this.zd && this.zd(a)
        }, Yd: function () {
            this.lb(this.s + this.dc * this.cc, this.u - this.ec * this.cc)
        }, Zd: function (a, b) {
            var c = this;
            this.ye = new l.Z({wc: this.cc}).ea({wc: 0}, 300).da(function () {
                c.lb(c.s + a * this.wc, c.u - b * this.wc)
            }).start()
        }, Te: function (a) {
            var b = this.aa;
            if (0 != b) switch (a = a ? a : .05 * this.sf, b) {
                case 37:
                    b = this.s - a, this.yc(b);
                    break;
                case 39:
                    b = this.s + a, this.yc(b);
                    break;
                case 38:
                    b = this.u + a, this.Ob(b);
                    break;
                case 40:
                    b = this.u - a, this.Ob(b);
                    break;
                case 16:
                    b = this.m - a, this.Sa(b);
                    break;
                case 17:
                    b = this.m + a, this.Sa(b)
            }
        }, cf: function () {
            this.Ga *= .875, this.m -= this.Ga, .125 > Math.abs(this.Ga) ? (this.Ga = 0, this.Fb = !1) : this.Sa()
        }, I: function () {
            this.Fb = !1, this.aa = 0
        }, Eb: function () {
            JTUtil.gId(_[360]) && DomUtil.destroy(JTUtil.gId(_[360]))
        }, Fd: function (a, b) {
            function c() {
                var a = JTUtil.cDom(_[39]);
                return DomUtil.setStyles(a, {
                    width: _[186],
                    height: _[361],
                    lineHeight: _[361],
                    color: _[362],
                    fontSize: _[363],
                    fontFamily: _[364] == h ? _[365] : _[366],
                    textShadow: _[367],
                    paddingLeft: _[368],
                    cursor: _[369],
                    textAlign: _[370]
                }), EventUtil.addEvent(a, _[359], function () {
                    DomUtil.setStyles(a, {backgroundColor: _[371]})
                }), EventUtil.addEvent(a, _[359], function () {
                    DomUtil.setStyles(a, {backgroundColor: _[13]})
                }), a
            }

            function i(a) {
                return DomUtil.setStyles(JTUtil.cDom(_[39]), {height: _[372], backgroundColor: a})
            }

            function j(a, b) {
                return DomUtil.setStyles(JTUtil.cDom(_[39]), {
                    position: _[184],
                    left: b + _[19],
                    height: _[186],
                    width: _[372],
                    backgroundColor: a
                })
            }

            var k, l, m, n, o;
            this.Eb(), k = JTUtil.cDom(_[39]), DomUtil.setStyles(k, {
                position: _[184],
                zIndex: 9999,
                opacity: .9999,
                visibility: _[185],
                border: _[373],
                backgroundColor: _[374],
                width: _[375],
                boxShadow: _[376]
            }), DomUtil.setProperties(k, {id: _[360]}), DomUtil.inject(k, this.target), EventUtil.addEvent(k, _[351], function (a) {
                EventUtil.stopPropagation(a), EventUtil.stopDefault(a)
            })
            // TODO 右键菜单
            /*, l = JTUtil.cDom(_[39]), DomUtil.setStyles(l, {
                position: _[38],
                backgroundColor: _[374],
                borderRadius: _[368],
                boxShadow: _[377],
                width: _[186],
                height: _[186],
                overflow: _[185]
            }), DomUtil.inject(l, k), EventUtil.addEvent(l, _[352], this.Eb, this), DomUtil.inject(j(_[378], 37), l), DomUtil.inject(j(_[379], 38), l), DomUtil.inject(j(_[380], 39), l), m = JTUtil.cDom(_[39]), DomUtil.setStyles(m, {
                position: _[38],
                left: _[381],
                height: _[186],
                width: _[186],
                textAlign: _[370]
            }), DomUtil.inject(m, l), l = c(), DomUtil.inject(l, m), 1 === this.Xa ? (n = [20851, 20110, 26480, 22270, 36719, 20214], o = [104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 106, 105, 101, 116, 117, 115, 111, 102, 116, 46, 99, 111, 109]) : (n = [20851, 20110, 85, 116, 111, 86, 82], o = [104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 106, 105, 101, 116, 117, 115, 111, 102, 116, 46, 99, 111, 109, 47, 116, 114, 97, 99, 107, 47, 114, 101, 100, 105, 114, 101, 99, 116, 46, 97, 115, 112, 120, 63, 102, 114, 111, 109, 61, 115, 100, 107, 45, 99, 111, 112, 121, 114, 105, 103, 104, 116, 38, 116, 111, 61, 104, 116, 116, 112, 37, 51, 65, 37, 50, 70, 37, 50, 70, 119, 119, 119, 46, 117, 116, 111, 118, 114, 46, 99, 111, 109, 37, 50, 70, 100, 101, 118, 101, 108, 111, 112, 101, 114, 99, 101, 110, 116, 101, 114, 37, 50, 70]), l.innerHTML = this.l(n), EventUtil.addEvent(l, _[352], function () {
                window.open(this.l(o))
            }, this), DomUtil.inject(i(_[382]), m), DomUtil.inject(i(_[383]), m), l = c(), DomUtil.inject(l, m), l.innerHTML = decodeURI(d[h]), this.ya ? EventUtil.addEvent(l, _[352], this.api_normalView, this) : DomUtil.setStyles(l, {
                color: _[384],
                cursor: _[385]
            }), l = c(), DomUtil.inject(l, m), l.innerHTML = decodeURI(e[h]), this.ya || 180 != this.tc - this.uc || 360 != this.kd - this.md ? DomUtil.setStyles(l, {
                color: _[384],
                cursor: _[385]
            }) : EventUtil.addEvent(l, _[352], this.api_littlePlanet, this), l = c(), DomUtil.inject(l, m), n = JTUtil.isFullScreen(), l.innerHTML = n ? decodeURI(g[h]) : decodeURI(f[h]), EventUtil.addEvent(l, _[352], this.api_fullScreen, this), DomUtil.inject(i(_[382]), m), DomUtil.inject(i(_[383]), m), l = c(), DomUtil.setStyles(l, {
                color: _[384],
                cursor: _[385]
            }), DomUtil.inject(l, m), l.innerHTML = b, a = EventUtil.getEventSize(a), b = this.target.getBoundingClientRect(), a.x = a.x - b.left, a.y = a.y - b.top, a = function (a, b, c, d, e) {
                a = a.getBoundingClientRect();
                var f = a.width;
                return a = a.height, d + f > b && (d -= f), e + a > c && (e -= a), 0 > d && (d = (b - f) / 2), 0 > e && (e = (c - a) / 2), {
                    left: d,
                    top: e
                }
            }(k, b.width, b.height, a.x, a.y), DomUtil.setStyles(k, {
                left: a.left + _[19],
                top: a.top + _[19],
                visibility: _[386]
            })*/
        }, Gf: function (a, b) {
            if (a) {
                this.g = this.g || this.sc();
                for (var c in this.Sb) EventUtil.removeEvent(this.g, c, this.Sb[c]);
                !this.g.src && (this.g.src = this.Mb), EventUtil.addEvent(this.g, _[387], function () {
                    this.pb && this.pb()
                }.bind(this)), EventUtil.addEvent(this.g, _[388], function () {
                    this.qb && this.qb()
                }.bind(this)), 0 === b && this.g.setAttribute(_[389], !0), this.g.setAttribute(_[390], !0), DomUtil.setStyles(this.g, {
                    position: _[184],
                    left: _[188],
                    top: _[188],
                    width: _[186],
                    height: _[186],
                    backgroundColor: _[187]
                }), DomUtil.inject(this.g, 0 === b ? this.P : this.Oa)
            }
        }
    }), window.JTPlay = j
}();